itextsharp pdf to image c# example : Add fields to pdf form control application platform web page azure wpf web browser Automate%20the%20Boring%20Stuff%20with%20Python%20(2015)17-part1605

7
PAttern mAtChing with 
regulAr exPreSSionS
You may be familiar with searching for text 
by pressing 
ctrl
-F and typing in the words 
you’re looking for. Regular expressions go one 
step further: They allow you to specify a pattern 
of text to search for. You may not know a business’s 
exact phone number, but if you live in the United States 
or Canada, you know it will be three digits, followed by
a hyphen, and then four more digits (and optionally, a three-digit area code 
at the start). This is how you, as a human, know a phone number when you 
see it: 415-555-1234 is a phone number, but 4,155,551,234 is not.
Regular expressions are helpful, but not many non-programmers 
know about them even though most modern text editors and word pro-
cessors, such as Microsoft Word or OpenOffice, have find and find-and-
replace features that can search based on regular expressions. Regular 
expressions are huge time-savers, not just for software users but also for 
Add fields to pdf form - C# PDF Field Edit Library: insert, delete, update pdf form field in C#.net, ASP.NET, MVC, Ajax, WPF
Online C# Tutorial to Insert, Delete and Update Fields in PDF Document
pdf form save in reader; change font size pdf fillable form
Add fields to pdf form - VB.NET PDF Field Edit library: insert, delete, update pdf form field in vb.net, ASP.NET, MVC, Ajax, WPF
How to Insert, Delete and Update Fields in PDF Document with VB.NET Demo Code
adding text fields to a pdf; adding image to pdf form
148   
Chapter 7
programmers. In fact, tech writer Cory Doctorow argues that even before 
teaching programming, we should be teaching regular expressions: 
“Knowing [regular expressions] can mean the difference between 
solving a problem in 3 steps and solving it in 3,000 steps. When 
you’re a nerd, you forget that the problems you solve with a couple 
keystrokes can take other people days of tedious, error-prone 
work to slog through.”
1
In this chapter, you’ll start by writing a program to find text patterns 
without using regular expressions and then see how to use regular expres-
sions to make the code much less bloated. I’ll show you basic matching with 
regular expressions and then move on to some more powerful features, 
such as string substitution and creating your own character classes. Finally, 
at the end of the chapter, you’ll write a program that can automatically 
extract phone numbers and email addresses from a block of text.
finding Patterns of text without regular expressions
Say you want to find a phone number in a string. You know the pattern: 
three numbers, a hyphen, three numbers, a hyphen, and four numbers. 
Here’s an example: 415-555-4242.
Let’s use a function named 
isPhoneNumber()
to check whether a string 
matches this pattern, returning either 
True
or 
False
. Open a new file editor 
window and enter the following code; then save the file as isPhoneNumber.py:
def isPhoneNumber(text):
    if len(text) != 12:
return False
for i in range(0, 3):
        if not text[i].isdecimal():
return False
    if text[3] != '-':
return False
for i in range(4, 7):
        if not text[i].isdecimal():
return False
    if text[7] != '-':
return False
for i in range(8, 12):
        if not text[i].isdecimal():
return False
    return True
print('415-555-4242 is a phone number:')
print(isPhoneNumber('415-555-4242'))
print('Moshi moshi is a phone number:')
print(isPhoneNumber('Moshi moshi'))
1. Cory Doctorow, “Here’s what ICT should really teach kids: how to do regular expressions,” 
Guardian, December 4, 2012, http://www.theguardian.com/technology/2012/dec/04/ict-teach-kids 
-regular-expressions/.
C# PDF Form Data Read Library: extract form data from PDF in C#.
Add necessary references: RasterEdge.Imaging.Basic.dll. C#.NET Demo Code: Retrieve All Form Fields from a PDF File in C#.NET.
create a pdf form that can be filled out; add fillable fields to pdf online
VB.NET PDF Form Data Read library: extract form data from PDF in
Add necessary references: RasterEdge.Imaging.Basic.dll. using RasterEdge.XDoc.PDF; Demo Code to Retrieve All Form Fields from a PDF File in VB.NET.
pdf fillable form creator; pdf form change font size
Pattern Matching with Regular Expressions
149
When this program is run, the output looks like this:
415-555-4242 is a phone number:
True
Moshi moshi is a phone number:
False
The 
isPhoneNumber()
function has code that does several checks to see 
whether the string in 
text
is a valid phone number. If any of these checks 
fail, the function returns 
False
. First the code checks that the string is 
exactly 12 characters u. Then it checks that the area code (that is, the first 
three characters in 
text
) consists of only numeric characters v. The rest 
of the function checks that the string follows the pattern of a phone num-
ber: The number must have the first hyphen after the area code w, three 
more numeric characters x, then another hyphen y, and finally four more 
numbers z. If the program execution manages to get past all the checks, it 
returns 
True
{.
Calling 
isPhoneNumber()
with the argument 
'415-555-4242'
will return 
True
. Calling 
isPhoneNumber()
with 
'Moshi moshi'
will return 
False
; the first 
test fails because 
'Moshi moshi'
is not 12 characters long.
You would have to add even more code to find this pattern of text in a 
larger string. Replace the last four 
print()
function calls in isPhoneNumber.py 
with the following: 
message = 'Call me at 415-555-1011 tomorrow. 415-555-9999 is my office.'
for i in range(len(message)):
    chunk = message[i:i+12]
    if isPhoneNumber(chunk):
print('Phone number found: ' + chunk)
print('Done')
When this program is run, the output will look like this:
Phone number found: 415-555-1011
Phone number found: 415-555-9999
Done
On each iteration of the 
for
loop, a new chunk of 12 characters from 
message
is assigned to the variable 
chunk
u. For example, on the first iteration, 
i
is 
0
, and 
chunk
is assigned 
message[0:12]
(that is, the string 
'Call me at 4'
). 
On the next iteration, 
i
is 
1
, and 
chunk
is assigned 
message[1:13]
(the string 
'all me at 41'
).
You pass 
chunk
to 
isPhoneNumber()
to see whether it matches the phone 
number pattern v, and if so, you print the chunk.
Continue to loop through 
message
, and eventually the 12 characters 
in 
chunk
will be a phone number. The loop goes through the entire string, 
testing each 12-character piece and printing any 
chunk
it finds that satisfies 
isPhoneNumber()
. Once we’re done going through 
message
, we print 
Done
.
C# PDF insert image Library: insert images into PDF in C#.net, ASP
Insert images into PDF form field. Access to freeware download and online C#.NET class source code. How to insert and add image, picture, digital photo, scanned
add fields to pdf form; convert pdf to editable form
VB.NET PDF insert image library: insert images into PDF in vb.net
Add images to any selected PDF page in VB.NET. Ability to put image into defined location on PDF page. Insert images into PDF form field in VB.NET.
change font pdf fillable form; cannot save pdf form
150   
Chapter 7
While the string in 
message
is short in this example, it could be millions 
of characters long and the program would still run in less than a second. A 
similar program that finds phone numbers using regular expressions would 
also run in less than a second, but regular expressions make it quicker to 
write these programs.
finding Patterns of text with regular expressions
The previous phone number–finding program works, but it uses a lot of 
code to do something limited: The 
isPhoneNumber()
function is 17 lines but 
can find only one pattern of phone numbers. What about a phone number 
formatted like 415.555.4242 or (415) 555-4242? What if the phone num-
ber had an extension, like 415-555-4242 x99? The 
isPhoneNumber()
function 
would fail to validate them. You could add yet more code for these addi-
tional patterns, but there is an easier way.
Regular expressions, called regexes for short, are descriptions for a 
pattern of text. For example, a 
\d
in a regex stands for a digit character—
that is, any single numeral 0 to 9. The regex 
\d\d\d-\d\d\d-\d\d\d\d
is used 
by Python to match the same text the previous 
isPhoneNumber()
function did: 
a string of three numbers, a hyphen, three more numbers, another hyphen, 
and four numbers. Any other string would not match the 
\d\d\d-\d\d\d-\d\d 
\d\d
regex.
But regular expressions can be much more sophisticated. For example, 
adding a 
3
in curly brackets (
{3}
) after a pattern is like saying, “Match this 
pattern three times.” So the slightly shorter regex 
\d{3}-\d{3}-\d{4}
also 
matches the correct phone number format.
Creating Regex Objects 
All the regex functions in Python are in the 
re
module. Enter the following 
into the interactive shell to import this module:
>>> import re
note
Most of the examples that follow in this chapter will require the 
re
module, so remem-
ber to import it at the beginning of any script you write or any time you restart IDLE. 
Otherwise, you’ll get a 
NameError: name 're' is not defined
error message.
Passing a string value representing your regular expression to 
re.compile()
returns a 
Regex
pattern object (or simply, a 
Regex
object).
To create a 
Regex
object that matches the phone number pattern, enter 
the following into the interactive shell. (Remember that 
\d
means “a digit 
character” and 
\d\d\d-\d\d\d-\d\d\d\d
is the regular expression for the cor-
rect phone number pattern.)
VB.NET PDF Password Library: add, remove, edit PDF file password
passwordSetting.IsAnnot = True ' Allow to fill form. passwordSetting document. passwordSetting.IsAssemble = True ' Add password to PDF file. PDFDocument
add email button to pdf form; adding images to pdf forms
C# PDF Password Library: add, remove, edit PDF file password in C#
passwordSetting.IsAnnot = true; // Allow to fill form. passwordSetting document. passwordSetting.IsAssemble = true; // Add password to PDF file. PDFDocument
create a fillable pdf form from a pdf; allow users to save pdf form
Pattern Matching with Regular Expressions
151
>>> phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
Now the 
phoneNumRegex
variable contains a 
Regex
object. 
Matching Regex Objects 
Regex
object’s 
search()
method searches the string it is passed for any 
matches to the regex. The 
search()
method will return 
None
if the regex pat-
tern is not found in the string. If the pattern is found, the 
search()
method 
returns a 
Match
object. 
Match
objects have a 
group()
method that will return 
the actual matched text from the searched string. (I’ll explain groups 
shortly.) For example, enter the following into the interactive shell:
>>> phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
>>> mo = phoneNumRegex.search('My number is 415-555-4242.')
>>> print('Phone number found: ' + mo.group())
Phone number found: 415-555-4242
The 
mo
variable name is just a generic name to use for 
Match
objects. 
This example might seem complicated at first, but it is much shorter than 
the earlier isPhoneNumber.py program and does the same thing.
Here, we pass our desired pattern to 
re.compile()
and store the resulting 
Regex
object in 
phoneNumRegex
. Then we call 
search()
on 
phoneNumRegex
and pass 
search()
the string we want to search for a match. The result of the search 
gets stored in the variable 
mo
. In this example, we know that our pattern 
will be found in the string, so we know that a 
Match
object will be returned. 
Knowing that 
mo
contains a 
Match
object and not the null value 
None
, we can 
call 
group()
on 
mo
to return the match. Writing 
mo.group()
inside our print 
statement displays the whole match, 
415-555-4242
.
PASSing rAw StringS to re.ComPile()
Remember that escape characters in Python use the backslash (\)‮ The string 
value 
'\n'
represents a single newline character, not a backslash followed by a 
lowercase n You need to enter the escape character 
\\
to print a single back-
slash‮ So 
'\\n'
is the string that represents a backslash followed by a lower-
case n However, by putting an 
r
before the first quote of the string value, you 
can mark the string as a raw string, which does not escape characters‮
Since regular expressions frequently use backslashes in them, it is conve-
nient to pass raw strings to the 
re.compile()
function instead of typing extra 
backslashes‮ Typing 
r'\d\d\d-\d\d\d-\d\d\d\d'
is much easier than typing 
'\\d\\d\\d-\\d\\d\\d-\\d\\d\\d\\d'
.NET PDF Document Viewing, Annotation, Conversion & Processing
Form Process. Fill in form data programmatically. Read form data from PDF form file. Add, Update, Delete form fields programmatically. Document Protect.
change font pdf form; chrome save pdf with fields
C# PDF Library SDK to view, edit, convert, process PDF file for C#
PDF SDK for .NET allows you to read, add, edit, update, and delete PDF file use RasterEdge PDF SDK for .NET to insert, delete and update PDF form fields in C#
add jpg to pdf form; adding form fields to pdf files
152   
Chapter 7
Review of Regular Expression Matching
While there are several steps to using regular expressions in Python, each 
step is fairly simple.
1. Import the regex module with 
import re
.
2. Create a 
Regex
object with the 
re.compile()
function. (Remember to use a 
raw string.)
3. Pass the string you want to search into the 
Regex
object’s 
search()
method. 
This returns a 
Match
object.
4. Call the 
Match
object’s 
group()
method to return a string of the actual 
matched text.
note
While I encourage you to enter the example code into the interactive shell, you should 
also make use of web-based regular expression testers, which can show you exactly 
how a regex matches a piece of text that you enter. I recommend the tester at http://
regexpal.com/.
more Pattern matching with regular expressions
Now that you know the basic steps for creating and finding regular expres-
sion objects with Python, you’re ready to try some of their more powerful 
pattern-matching capabilities.
Grouping with Parentheses
Say you want to separate the area code from the rest of the phone number. 
Adding parentheses will create groups in the regex: 
(\d\d\d)-(\d\d\d-\d\d\d\d)
Then you can use the 
group()
match object method to grab the matching 
text from just one group.
The first set of parentheses in a regex string will be group 
1
. The sec-
ond set will be group 
2
. By passing the integer 
1
or 
2
to the 
group()
match 
object method, you can grab different parts of the matched text. Passing 
0
or nothing to the 
group()
method will return the entire matched text. Enter 
the following into the interactive shell:
>>> phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')
>>> mo = phoneNumRegex.search('My number is 415-555-4242.')
>>> mo.group(1)
'415'
>>> mo.group(2)
'555-4242'
>>> mo.group(0)
'415-555-4242'
>>> mo.group()
'415-555-4242'
Pattern Matching with Regular Expressions
153
If you would like to retrieve all the groups at once, use the 
groups()
method—note the plural form for the name.
>>> mo.groups()
('415', '555-4242')
>>> areaCode, mainNumber = mo.groups()
>>> print(areaCode)
415
>>> print(mainNumber)
555-4242
Since 
mo.groups()
returns a tuple of multiple values, you can use the 
multiple-assignment trick to assign each value to a separate variable, as in 
the previous 
areaCode, mainNumber = mo.groups()
line.
Parentheses have a special meaning in regular expressions, but what do 
you do if you need to match a parenthesis in your text? For instance, maybe 
the phone numbers you are trying to match have the area code set in paren-
theses. In this case, you need to escape the 
(
and 
)
characters with a back-
slash. Enter the following into the interactive shell:
>>> phoneNumRegex = re.compile(r'(\(\d\d\d\)) (\d\d\d-\d\d\d\d)')
>>> mo = phoneNumRegex.search('My phone number is (415) 555-4242.')
>>> mo.group(1)
'(415)'
>>> mo.group(2)
'555-4242'
The 
\(
and 
\)
escape characters in the raw string passed to 
re.compile()
will match actual parenthesis characters.
Matching Multiple Groups with the Pipe
The 
|
character is called a pipe. You can use it anywhere you want to match one 
of many expressions. For example, the regular expression 
r'Batman|Tina Fey'
will match either 
'Batman'
or 
'Tina Fey'
When both Batman and Tina Fey occur in the searched string, the first 
occurrence of matching text will be returned as the 
Match
object. Enter the 
following into the interactive shell:
>>> heroRegex = re.compile (r'Batman|Tina Fey')
>>> mo1 = heroRegex.search('Batman and Tina Fey.')
>>> mo1.group()
'Batman'
>>> mo2 = heroRegex.search('Tina Fey and Batman.')
>>> mo2.group()
'Tina Fey'
note
You can find all matching occurrences with the 
findall()
method that’s discussed in 
“The 
findall()
Method” on page 157.
154   
Chapter 7
You can also use the pipe to match one of several patterns as part of 
your regex. For example, say you wanted to match any of the strings 
'Batman'
'Batmobile'
'Batcopter'
, and 
'Batbat'
. Since all these strings start with 
Bat
, it 
would be nice if you could specify that prefix only once. This can be done 
with parentheses. Enter the following into the interactive shell:
>>> batRegex = re.compile(r'Bat(man|mobile|copter|bat)')
>>> mo = batRegex.search('Batmobile lost a wheel')
>>> mo.group()
'Batmobile'
>>> mo.group(1)
'mobile'
The method call 
mo.group()
returns the full matched text 
'Batmobile'
while 
mo.group(1)
returns just the part of the matched text inside the first 
parentheses group, 
'mobile'
. By using the pipe character and grouping paren-
theses, you can specify several alternative patterns you would like your regex 
to match.
If you need to match an actual pipe character, escape it with a back-
slash, like 
\|
.
Optional Matching with the Question Mark
Sometimes there is a pattern that you want to match only optionally. That 
is, the regex should find a match whether or not that bit of text is there. 
The 
?
character flags the group that precedes it as an optional part of the 
pattern. For example, enter the following into the interactive shell:
>>> batRegex = re.compile(r'Bat(wo)?man')
>>> mo1 = batRegex.search('The Adventures of Batman')
>>> mo1.group()
'Batman'
>>> mo2 = batRegex.search('The Adventures of Batwoman')
>>> mo2.group()
'Batwoman'
The 
(wo)?
part of the regular expression means that the pattern 
wo
is 
an optional group. The regex will match text that has zero instances or 
one instance of wo in it. This is why the regex matches both 
'Batwoman'
and 
'Batman'
Using the earlier phone number example, you can make the regex look 
for phone numbers that do or do not have an area code. Enter the following 
into the interactive shell:
>>> phoneRegex = re.compile(r'(\d\d\d-)?\d\d\d-\d\d\d\d')
>>> mo1 = phoneRegex.search('My number is 415-555-4242')
>>> mo1.group()
'415-555-4242'
Pattern Matching with Regular Expressions
155
>>> mo2 = phoneRegex.search('My number is 555-4242')
>>> mo2.group()
'555-4242'
You can think of the 
?
as saying, “Match zero or one of the group pre-
ceding this question mark.”
If you need to match an actual question mark character, escape it with 
\?
.
Matching Zero or More with the Star
The 
*
(called the star or asterisk) means “match zero or more”—the group 
that precedes the star can occur any number of times in the text. It can be 
completely absent or repeated over and over again. Let’s look at the Batman 
example again.
>>> batRegex = re.compile(r'Bat(wo)*man')
>>> mo1 = batRegex.search('The Adventures of Batman')
>>> mo1.group()
'Batman'
>>> mo2 = batRegex.search('The Adventures of Batwoman')
>>> mo2.group()
'Batwoman'
>>> mo3 = batRegex.search('The Adventures of Batwowowowoman')
>>> mo3.group()
'Batwowowowoman'
For 
'Batman'
, the 
(wo)*
part of the regex matches zero instances of 
wo
in the string; for 
'Batwoman'
, the 
(wo)*
matches one instance of 
wo
; and for 
'Batwowowowoman'
(wo)*
matches four instances of 
wo
.
If you need to match an actual star character, prefix the star in the 
regular expression with a backslash, 
\*
.
Matching One or More with the Plus
While 
*
means “match zero or more,” the 
+
(or plus) means “match one or 
more.” Unlike the star, which does not require its group to appear in the 
matched string, the group preceding a plus must appear at least once. It is 
not optional. Enter the following into the interactive shell, and compare it 
with the star regexes in the previous section:
>>> batRegex = re.compile(r'Bat(wo)+man')
>>> mo1 = batRegex.search('The Adventures of Batwoman')
>>> mo1.group()
'Batwoman'
>>> mo2 = batRegex.search('The Adventures of Batwowowowoman')
>>> mo2.group()
'Batwowowowoman'
156   
Chapter 7
>>> mo3 = batRegex.search('The Adventures of Batman')
>>> mo3 == None
True
The regex 
Bat(wo)+man
will not match the string 
'The Adventures of 
Batman'
because at least one 
wo
is required by the plus sign.
If you need to match an actual plus sign character, prefix the plus sign 
with a backslash to escape it: 
\+
.
Matching Specific Repetitions with Curly Brackets
If you have a group that you want to repeat a specific number of times, fol-
low the group in your regex with a number in curly brackets. For example, 
the regex 
(Ha){3}
will match the string 
'HaHaHa'
, but it will not match 
'HaHa'
since the latter has only two repeats of the 
(Ha)
group.
Instead of one number, you can specify a range by writing a minimum, 
a comma, and a maximum in between the curly brackets. For example, the 
regex 
(Ha){3,5}
will match 
'HaHaHa'
'HaHaHaHa'
, and 
'HaHaHaHaHa'
.
You can also leave out the first or second number in the curly brackets 
to leave the minimum or maximum unbounded. For example, 
(Ha){3,}
will 
match three or more instances of the 
(Ha)
group, while 
(Ha){,5}
will match 
zero to five instances. Curly brackets can help make your regular expres-
sions shorter. These two regular expressions match identical patterns:
(Ha){3}
(Ha)(Ha)(Ha)
And these two regular expressions also match identical patterns:
(Ha){3,5}
((Ha)(Ha)(Ha))|((Ha)(Ha)(Ha)(Ha))|((Ha)(Ha)(Ha)(Ha)(Ha))
Enter the following into the interactive shell:
>>> haRegex = re.compile(r'(Ha){3}')
>>> mo1 = haRegex.search('HaHaHa')
>>> mo1.group()
'HaHaHa'
>>> mo2 = haRegex.search('Ha')
>>> mo2 == None
True
Here, 
(Ha){3}
matches 
'HaHaHa'
but not 
'Ha'
. Since it doesn’t match 
'Ha'
search()
returns 
None
.
greedy and nongreedy matching
Since 
(Ha){3,5}
can match three, four, or five instances of 
Ha
in the string 
'HaHaHaHaHa'
, you may wonder why the 
Match
object’s call to 
group()
in the 
Documents you may be interested
Documents you may be interested