Produc
i
ng d
i
fferent document format
s
201
123: sub description {
124:
125:
if ($opts{f} eq 'h') {
126:
print "<h1>DESCRIPTION</h1>\n";
127:
} elsif ($opts{f} eq 'p') {
128:
print "=head1 DESCRIPTION\n\n";
129:
} elsif ($opts{f} eq 't') {
130:
print "DESCRIPTION\n\n";
131:
}
132: }
133:
134: sub text {
135:
my $content = shift;
136:
137:
if ($opts{f} eq 'h') {
138:
print "<p>$content->[1]</p>\n"
139:
} elsif ($opts{f} eq 'p') {
140:
print wrap('', '', trim($content->[1])), "\n\n";
141:
} elsif ($opts{f} eq 't') {
142:
print wrap($ind, $ind, trim($content->[1])), "\n\n";
143:
}
144: }
145:
146: sub code {
147:
my $content = shift;
148:
149:
if ($opts{f} eq 'h') {
150:
print "<pre>$content->[1]</pre>\n"
151:
} elsif ($opts{f} eq 'p') {
152:
print "$content->[1]\n";
153:
} elsif ($opts{f} eq 't') {
154:
print "$content->[1]\n";
155:
}
156: }
157:
158: sub head {
159:
my $content = shift;
160:
161:
if ($opts{f} eq 'h') {
162:
print "<h$head>", trim($content->[1]), "</h$head>\n"
163:
} elsif ($opts{f} eq 'p') {
164:
print "=head$head ", trim($content->[1]), "\n\n";
165:
} elsif ($opts{f} eq 't') {
166:
print trim($content->[1]), "\n\n";
167:
}
168: }
169:
170: sub list {
171:
my ($attrs, $content) = @_;
172:
173:
my %list = (bullet => 'ul', numbered => 'ol');
Pdf rotate all pages - rotate PDF page permanently in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Empower Users to Change the Rotation Angle of PDF File Page Using C#
how to rotate a single page in a pdf document; rotate pdf page and save
Pdf rotate all pages - VB.NET PDF Page Rotate Library: rotate PDF page permanently in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
PDF Document Page Rotation in Visual Basic .NET Class Application
how to rotate just one page in pdf; save pdf after rotating pages
202
CHAPTER 
XML
174:
175:
my $type = $attrs->{TYPE};
176:
177:
if ($opts{f} eq 'h') {
178:
print "<$list{$type}>\n";
179:
while (my @node = splice @$content, 0, 2) {
180:
if ($node[0] eq 'ITEM') {
181:
print "<li>$node[1]->[2]</li>\n";
182:
}
183:
}
184:
print "</$list{$type}>\n";
185:
} elsif ($opts{f} eq 'p') {
186:
print "=over 4\n";
187:
while (my @node = splice @$content, 0, 2) {
188:
my $cnt = 1;
189:
if ($node[0] eq 'ITEM') {
190:
print "=item *\n$node[1]->[2]\n\n";
191:
}
192:
}
193:
print "=back\n\n";
194:
} elsif ($opts{f} eq 't') {
195:
while (my @node = splice @$content, 0, 2) {
196:
my $cnt = 1;
197:
if ($node[0] eq 'ITEM') {
198:
print $ind, "* $node[1]->[2]\n";
199:
}
200:
}
201:
print "\n";
202:
}
203: }
204:
205: sub author {
206:
if ($opts{f} eq 'h') {
207:
print "<h1>AUTHOR</h1>\n";
208:
} elsif ($opts{f} eq 'p') {
209:
print "=head1 AUTHOR\n\n";
210:
} elsif ($opts{f} eq 't') {
211:
print "AUTHOR\n\n";
212:
}
213: }
214:
215: sub aname {
216:
my $content = shift;
217:
218:
if ($opts{f} eq 'h') {
219:
print "<p>$content->[1]\n"
220:
} elsif ($opts{f} eq 'p') {
221:
print trim($content->[1]), ' ';
222:
} elsif ($opts{f} eq 't') {
223:
print $ind, trim($content->[1]), ' ';
224:
}
VB.NET PDF Page Delete Library: remove PDF pages in vb.net, ASP.
NET example for how to delete several defined pages from a PDF document Dim detelePageindexes = New Integer() {1, 3, 5, 7, 9} ' Delete pages. All Rights Reserved
save pdf rotate pages; pdf rotate single page and save
VB.NET PDF Page Insert Library: insert pages into PDF file in vb.
doc2.InsertPages(pages, pageIndex) ' Output the new document how to use VB to insert an empty page to a specific location of current PDF file All Rights Reserved
how to reverse page order in pdf; how to rotate one page in pdf document
Produc
i
ng d
i
fferent document format
s
203
225: }
226:
227: sub email {
228:
my $content = shift;
229:
230:
if ($opts{f} eq 'h') {
231:
print '&lt;', trim($content->[1]), "&gt;</p>\n"
232:
} elsif ($opts{f} eq 'p') {
233:
print '<', trim($content->[1]), ">\n\n";
234:
} elsif ($opts{f} eq 't') {
235:
print '<', trim($content->[1]), ">\n\n";
236:
}
237: }
238:
239: sub see_also {
240:
241:
if ($opts{f} eq 'h') {
242:
print "<h1>SEE ALSO</h1>\n";
243:
} elsif ($opts{f} eq 'p') {
244:
print "=head1 SEE ALSO\n\n";
245:
} elsif ($opts{f} eq 't') {
246:
print "SEE ALSO\n\n";
247:
}
248: }
249:
250: sub trim {
251:
local $_ = shift;
252:
253:
s/\n/ /g;
254:
s/^\s+//;
255:
s/\s+$//;
256:
257:
$_;
258: }
This is the longest script that we have looked at so far, so let’s review it a section at
a time.
Lines 1 to 3 should be the standard way that you start a Perl script.
Lines 5 to 7 bring in the modules which we will be using. 
XML::Parser
will be
used to parse the 
XML
input, 
Getopt::Std
is used to process command line
options, and 
Text::Wrap
is used to reformat lines of text.
Lines 9 to 11 define the types of formatting that the script can handle in a hash.
Each value is another hash containing information about the format. Currently, it
only lists the name of the format, but if there are other attributes of a format that
are useful, this would be a good place to store them.
C# PDF Page Delete Library: remove PDF pages in C#.net, ASP.NET
1. public void DeletePages(int[] pageIndexes). Description: Delete specified pages from the input PDF file. Parameters: All Rights Reserved.
rotate pdf pages in reader; pdf rotate pages and save
C# PDF Page Insert Library: insert pages into PDF file in C#.net
how to merge PDF document files by C# code, how to rotate PDF document page to insert empty pages to a specific location of current PDF file. All Rights Reserved
rotate individual pages in pdf; how to rotate a page in pdf and save it
204
CHAPTER 
XML
Lines 13 to 19 use the function 
getops
from 
Getopt::Std
to process the com-
mand line flags. In this case there is just one flag that indicates the chosen output
type. This is stored in 
$opts{f}
. If we are passed an unknown format we warn the
user and 
die
. On line 19 we let the user know what format we are using.
Line 21 creates an 
XML
parser using the Tree style and line 22 uses this object to
parse the 
XML
document, returning the document tree data structure which we
store in 
$tree
.
Lines 24 to 26 define some global variables: 
$level
will store the nesting level
of the current element, 
$ind
will store a string of spaces which will be used to
indent text, and 
$head
will store the current header level.
Line 28 calls the 
top
function which is defined in lines 67 to 81. This function
prints header information for the chosen format. For 
HTML
, this is all of the
<HEAD>
</HEAD>
section, for 
POD
it is simply the text 
=pod
, and for text it is the
title of the document underlined. Notice that we use the expression 
$tree->[1]-
>[4]->[2]
to get the title of the document. We can take this kind of shortcut
because we know the structure of our document. 
$tree->[1]
is the content of the
first node in the tree (i.e., everything within the 
<README>
element). 
$tree->[1]-
>[4]
is the content of the second node contained within the 
<README>
element.
The first node within this element is the text node containing the newline character
immediately after the 
<README>
tag.7 The second node is the 
<NAME>
element.
$tree->[1]->[4]->[2]
is the content of the first node within the 
<NAME>
ele-
ment, i.e., the name text, which we will use as a title.
Line 30 calls the 
process_node
function which is defined in lines 34 to 65. This
function is where most of the work goes on. The basic structure should be familiar
from the previous tree-based parsing scripts that we have discussed. The function is
passed the type of a node together with a reference to its content. If the node is an
element (remember the value of 
$type
is the name of the element or zero if it is a
text node), we extract the attributes and call the relevant subroutine to process each
type of element. In most cases we pass the element content to the subroutine, but
there are two exceptions. The 
<DESCRIPTION>
element has no useful content
(other than, of course, its contained elements, which will be handled elsewhere).
The 
<LIST>
element is more complex. First, it is the only element with an attribute
list which needs to be passed on to the subroutine and, second, as the 
list
subrou-
tine processes all of the element’s content, we need to set the content to an empty
list to prevent it being processed again.
7
Of course, the script now relies on this newline character always being there. Relying on the presence of
this ignorable white space is a serious limitation of this script, and if you wanted to use a script like this in
earnest you would need to design something a little more robust.
VB.NET PDF - WPF PDF Viewer for VB.NET Program
Users can rotate PDF pages, zoom in or zoom out PDF pages and WPF PDF Viewer for VB.NET is a PDF utility annotation rectangle, polygon and so on are all can be
pdf expert rotate page; rotate one page in pdf
C# WPF PDF Viewer SDK to view PDF document in C#.NET
Compatible with all Windows systems and supports .NET Framework 2.0 & above versions. A powerful .NET WPF component able to rotate one PDF page or whole PDF
how to rotate page in pdf and save; pdf rotate one page
Produc
i
ng d
i
fferent document format
s
205
Having processed the element, we need to process any child elements. This is
accomplished in much the same way as we have in previous examples. We simply
walk the 
@$content
list a node at a time (where a node is represented by two items
in the array), passing the nodes one at a time to 
process_node
. We pause only to
increment the 
$level
and 
$head
variables before starting to process the list and to
decrement them after we have finished.
Once the script returns from the main call to 
process_node
, the final action
(line 32) is to call the function 
bot
. The function is defined in lines 83 to 91 and
simply finishes off the file in that same way that 
top
started it (except that in this
case the processing is much simpler).
The rest of the script consists of definitions of the functions which handle the
various element types. Most of these are very similar and simple. All they do is print
out the content of the element surrounded by various fixed strings. It is, however,
worth taking a closer look at the 
head
and 
list
functions.
head
is the function which prints out header sections. In its 
POD
and 
HTML
sec-
tions it needs to know which level of header to display. It accomplishes this by using the
global 
$head
variable which is incremented each time a 
<SUBSECTION>
element is
encountered. Like many of the other element functions, 
head
also makes use of a helper
function called 
trim
which removes all of the excess white space from a text string.
list
is the most complex of the element functions as it builds up a complete list
rather than relying on the usual subelement handling which we have used for other
elements. This is because in the future we may well want to support numbered lists,
and it will be far easier if the list numbers can all be calculated within the same func-
tion. This function therefore traverses the 
@$content
array in much the same way
as the 
process_node
function.
10.5.3 Using 
t
he 
XML
documen
t
t
ransforma
t
ion scrip
t
Having described the script in detail, let’s run it in the various modes on our sample
document and see what output we get. The script takes the input file as an argu-
ment and writes its output to 
STDOUT
. We can, therefore, call the script like this:
format_xml.pl -f p doc.xml > doc.pod
format_xml.pl -f h doc.xml > doc.html
format_xml.pl -f t doc.xml > doc.txt
to get the 
POD
HTML,
and text outputs. Here are the results.
POD
file
=pod
=head1 NAME
VB.NET PDF - View PDF with WPF PDF Viewer for VB.NET
Compatible with all Windows systems and supports .NET Framework 2.0 & above versions. Able to rotate one PDF page or whole PDF while in viewing.
rotate pdf page; change orientation of pdf page
C# TIFF: How to Rotate TIFF Using C# Code in .NET Imaging
VB.NET How-to, VB.NET PDF, VB.NET Word, VB.NET Excel, VB TIFFPage)doc.GetPage(0); page.Rotate(RotateOder.Clockwise90); doc.Save(@"C:\rotate.tif All Rights Reserved
pdf rotate single page; rotate pages in pdf expert
206
CHAPTER 
XML
Test README File
=head1 SYNOPSIS
This is a summary of the file.
It should appear in PRE tags
=head1 DESCRIPTION
This is the full description of the file
=head2 Subsection Title
Subsection text
=head2 Another Subsection Title
More Subsection text
=over 4
=item *
List item 1
=item *
List item 2
=back
=head1 AUTHOR
Dave Cross <dave@mag-sol.com>
=head1 SEE_ALSO
=over 4
=item *
Something
=item *
Something else
=back
=cut
HTML
file
<html>
<head>
<title>Test README File</title>
</head>
<body>
<h1>NAME</h1>
<p>Test README File</p>
<h1>SYNOPSIS</h1>
<pre>
Produc
i
ng d
i
fferent document format
s
207
This is a summary of the file.
It should appear in PRE tags
</pre>
<h1>DESCRIPTION</h1>
<p>This is the full description of the file</p>
<h2>Subsection Title</h2>
<p>Subsection text</p>
<h2>Another Subsection Title</h2>
<p>More Subsection text</p>
<ul>
<li>List item 1</li>
<li>List item 2</li>
</ul>
<h1>AUTHOR</h1>
<p>Dave Cross
&lt;dave@mag-sol.com&gt;</p>
<h1>SEE_ALSO</h1>
<ul>
<li>Something</li>
<li>Something else</li>
</ul>
</body>
</html>
Tex
t
file
Test README File
----------------
NAME
Test README File
SYNOPSIS
This is a summary of the file.
It should appear in PRE tags
DESCRIPTION
This is the full description of the file
Subsection Title
Subsection text
Another Subsection Title
More Subsection text
* List item 1
* List item 2
AUTHOR
210
CHAPTER 
Bu
i
ld
i
ng your own par
s
er
s
The prebuilt parsers that we have looked at in the two previous chapters are, of
course, very useful, but there are many times when you need to parse data in a
format for which a prebuilt parser does not exist. In these cases you can create
your own parser using a number of Perl modules. The most flexible of these is
Parse::RecDescent
, and in this chapter we take a detailed look at its use. 
11.1 In
t
roduc
t
ion 
t
o Parse
:
:
RecDescen
t
Parse::RecDescent
is a tool for building top-down parsers which was written by
Damian Conway. It doesn’t form a part of the standard Perl distribution, so you will
need to get it from the 
CPAN
. It can be found at http:
/
/
www.cpan.org
/
modules
/
by-module
/
Parse
/
. The module comes with copious documentation and more
example code than anyone would ever want to read. 
Using 
Parse::RecDescent
is quite simple. In summary you define a grammar
for the parser to use, create a parser object to process the grammar, and then pass
the text to be parsed to the parser. We’ll see more specific examples later, but all the
programs will have a basic structure which looks like this:
use Parse::RecDescent;
my $grammar = q(
# Text that define your grammar
);
my $parser = Parse::RecDescent->new($grammar);
my $text = q(
# Scalar which contains the text to be parsed
);
# top_rule is the name of the top level rule in you grammar.
$parser->top_rule($text);
11.1.1 Example
:
parsing simple English sen
t
ences
For example, if we go back to the example of simple English sentences which we
used in chapter 8, we could write code like this in order to check for valid sentences.
use Parse::RecDescent;
my $grammar = q(
sentence: subject verb object
subject: noun_phrase
object: noun_phrase
verb: 'wrote' | 'likes' | 'ate'
noun_phrase: pronoun | proper_noun | article noun
article: 'a' | 'the' | 'this'
pronoun: 'it' | 'he'
proper_noun: 'Perl' | 'Dave' | 'Larry'
Documents you may be interested
Documents you may be interested