c# pdf viewer itextsharp : Change page order pdf acrobat application software utility html winforms .net visual studio Windows%20Powershell%20in%20Action%202nd%20Edition81-part1540

780
CHAPTER 18
W
ORKING
WITH
COM
$ie.Navigate2("http://en.wiktionary.org/wiki/" + 
[Web.HttpUtility]::UrlEncode($word))
while($ie.ReadyState -ne 4)         
start-sleep 1 
$bodyContent = $ie.Document.getElementById("bodyContent").innerHtml 
$showText=$false 
$lastWasBlank = $true 
$gotResult = $false
switch -regex ($bodyContent.Split("`n"))       
'^\<DIV class=infl-table' {
$showText = $true
continue
'^\<DIV|\<hr' {
$showText = $false
'\[.*edit.*\].*Translations' {
$showText = $false
{$showText} {
$line = $_ -replace '\<[^>]+\>', ' '
$line = ($line -replace '[ \t]{2,}', ' ').Trim()
if ($line.Length)
{
$line
$gotResult = $true
$lineWasBlank = $false
}
else
{
if (! $lineWasBlank)
{
$line
$lineWasBlank = $true
}
}
}
if (! $gotResult) 
{
"No Answer Found for: $word" 
}
if (! $visible) 
{
$ie.Quit()                          
}
Navigate to 
Wiktionary
c
Wait until 
ready
d
Extract data
e
Process 
data
f
Close IE
g
Change page order pdf acrobat - re-order PDF pages in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Support Customizing Page Order of PDF Document in C# Project
move pages in a pdf; move pages within pdf
Change page order pdf acrobat - VB.NET PDF Page Move Library: re-order PDF pages in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Sort PDF Document Pages Using VB.NET Demo Code
how to rearrange pdf pages in preview; pdf reorder pages online
U
SING
COM 
TO
MANAGE
APPLICATIONS
781
You’re going to load an additional .
NET
assembly 
B
because you need to encode your 
word into a 
URL
to send it to the Wiktionary site. Next, you get an instance of the 
Internet Explorer object. You tell 
IE
to navigate to the Wiktionary website and look up 
the word 
c
. This may take a while, so you loop, waiting for the document to be 
loaded 
d
. When the document is ready, you use the Internet Explorer Document 
Object Model to extract the information you want out of the document 
e
. Even after 
you’ve extracted the document, the information you’re after still requires a significant 
amount of work to locate and extract. You do this using the 
switch
statement 
f
. If 
there was an answer, you display it; if not, you give the user an error message.
And finally, if the 
visible
flag hasn’t been specified, close the browser window 
g
Let’s try looking something up:
PS (1) > ./Get-WordDefinition.ps1 factorial
Singular factorial
Plural factorials 
factorial ( plural factorials )
( mathematics ) The result of multiplying a given number of
consecutive integers from 1 to the given number. In 
equations, it is symbolized by an exclamation mark (!). For 
example, 5! = 1 * 2 * 3 * 4 * 5 = 120.
[ edit ] Usage notes
" n !" is read as "factorial of n ."
PS (2) > 
And there you go—a world of crucial knowledge at our fingertips!
NOTE
In practice, this type of script, which is dependent on a website 
that you don’t control, is very fragile. It’s extremely dependent on the 
structure of pages generated by the target website, and these are subject 
to change at any time. (In fact, this example had to be revised during 
the production of the book because Encarta, the original target web-
site, changed its format.) If the page structure changes, your script will 
be broken. (A well-structured data source such as the RSS  feed,  as 
you’ll see in the next example, allows for much more reliable scripts.) 
18.4.2
Using Microsoft Word to do spell checking
Wouldn’t it be great if every environment you worked in had spell checking like word 
processors do? With PowerShell and 
COM
, you can get at least part of the way there. 
You’re going to write a script that will use Microsoft Word to spell-check the contents 
of the clipboard and then paste them back. You’ll call this script 
Get-Spelling.ps1
.
Let’s see how it’s used. First, you start Notepad and type some text with errors 
into it:
PS (1) > notepad
.NET PDF Document Viewing, Annotation, Conversion & Processing
Convert image files to PDF. File & Page Process. Re-order, rotate PDF pages. PDF Read. Print. Support for all the print modes in Acrobat PDF.
reorder pages in pdf document; move pages in a pdf file
VB.NET PDF: How to Create Watermark on PDF Document within
create a watermark to PDF file in order to help or image (such as business's logo) on any desired PDF page. And with our PDF Watermark Creator, users need no
pdf change page order online; reordering pages in pdf document
782
CHAPTER 18
W
ORKING
WITH
COM
Next, select the text and copy it to the clipboard. This is shown in figure 18.7. 
Now run the script:
PS (2) > Get-Spelling
You’ll see the Word Spelling dialog box pop up, as shown in figure 18.8.
You go through all of the spelling errors and fix them as appropriate. Once all the 
errors are fixed, the dialog box will disappear and the pop-up box will be displayed, 
indicating that the revised text is available in the clipboard. Switch back to the Note-
pad window and paste the revised text into the window as shown in figure 18.9.
And you’re done. The text in the Notepad window is correctly spelled. Now that you 
know how to use this script, let’s take a look at the actual code, which is shown in the 
following listing.
$wshell = New-Object -com WScript.Shell                             
$word = New-Object -com Word.Application                           
$word.Visible = $false                                             
Figure 18.7 This Notepad window 
shows the misspelled text that 
you will be fixing using the
Get-Spelling
script.
Figure 18.8 
The Microsoft Word 
spell checker 
launched by the 
Get-Spelling
script shows the 
misspelled text that 
was copied from 
the clipboard. 
Figure 18.9 The Notepad window 
showing the corrected text
Listing18.5    The Get-Spelling script
GIF to PDF Converter | Convert GIF to PDF, Convert PDF to GIF
as easy as printing; Support both single-page and batch Drop image to process GIF to PDF image conversion; Provide filter option to change brightness, color and
move pdf pages; change pdf page order
JPEG to PDF Converter | Convert JPEG to PDF, Convert PDF to JPEG
It can be used standalone. JPEG to PDF Converter is able to convert image files to PDF directly without the software Adobe Acrobat Reader for conversion.
how to move pages in a pdf file; how to reorder pdf pages
T
HE
WSH S
CRIPT
C
ONTROL
CLASS
783
$doc = $word.Documents.Add()                                      
$word.Selection.Paste()                                            
if ($word.ActiveDocument.SpellingErrors.Count -gt 0)         
{
$word.ActiveDocument.CheckSpelling()                     
$word.Visible = $false                                   
$word.Selection.WholeStory()                             
$word.Selection.Copy()                                   
$wshell.PopUp( "The spell check is complete, " +         
"the clipboard holds the corrected text." ) 
else 
{
[void] $wshell.Popup("No Spelling Errors were detected.") 
}
$x = [ref] 0                                                  
$word.ActiveDocument.Close($x) 
$word.Quit()
The first thing you do is create the object instances you’re going to use. You need an 
instance of 
WScript.Shell
to pop up a message box and the 
Word.Application 
object for the bulk of the work. Once you have the 
Word.Application
object, you’ll 
make the Word window invisible, and then add an empty document to hold the text 
you want to spell-check. Next, you copy the contents from the clipboard to the Word 
document you created and see if you need to spell-check the text. If you do, you pres-
ent the Spelling dialog box. When the spell check is complete, you select all the text 
and copy it back to the clipboard so you can paste it into the original document and 
inform the user that the corrected text is available. If there were no spelling errors, 
you’ll display a message box confirming this. The last step is to discard the document 
you created and close the application. With this script, you can add spell-checking 
capabilities to any application that lets you select and copy text. 
NOTE
Obviously, if Microsoft Word is not your word processor of 
choice, it should be simple to modify the script to work with any word 
processor that exports a similar automation model. 
So far, we’ve focused on using 
COM
to manipulate applications, but it can also be 
used to access other features in Windows. Let’s see how 
COM
can be used to bridge 
between PowerShell and older Active Scripting–based languages like 
VBS
cript.
18.5
T
HE
WSH S
CRIPT
C
ONTROL
CLASS
In this section, we’ll show how to use the 
ScriptControl
class from PowerShell. 
This object will allow PowerShell to evaluate fragments of 
VBS
cript (or JavaScript or 
any other language that has an 
ActiveScript
engine) embedded inline in a Power-
Shell script. This allows you to reuse existing 
VBS
cript code simply by copying the 
code into a PowerShell script.
PDF to WORD Converter | Convert PDF to Word, Convert Word to PDF
PDF to Word Converter has accurate output, and PDF to Word Converter doesn't need the support of Adobe Acrobat & Microsoft Word.
how to rearrange pages in pdf using reader; how to rearrange pdf pages
TIFF to PDF Converter | Convert TIFF to PDF, Convert PDF to TIFF
doesn't require other third-party such as Adobe Acrobat. a few clicks; Ability to convert PDF documents to and upgrade; Easy to convert multi-page PDF files to
how to reorder pages in a pdf document; how to rearrange pages in pdf document
784
CHAPTER 18
W
ORKING
WITH
COM
NOTE
There’s another reason that this example is important. Some 
COM
objects work in 
COM
automation languages such as VBScript, 
but not in .
NET
environments such as PowerShell. Using this example, 
you can package any required fragments of 
VBS
cript into the overall 
PowerShell script.
18.5.1
Embedding VBScript code in a PowerShell script
You start by using the 
ScriptControl
class to build a 
VBS
cript 
CodeObject
. Be 
aware that this class is not available on all versions of Microsoft Windows. This object 
makes the 
VBS
cript functions defined in the script available to the caller as methods 
on this code object. The function shown in the following listing returns a code object 
with two of these methods on it: 
GetLength()
, which returns the length of a string, 
and 
Add()
, which adds two objects together.
function Call-VBScript 
{
$sc = New-Object -ComObject ScriptControl
$sc.Language = 'VBScript'
$sc.AddCode('
Function GetLength(ByVal s)
GetLength = Len(s)
End Function
Function Add(ByVal x, ByVal y)
Add = x + y
End Function
')
$sc.CodeObject 
}
Let’s use the function to mix and match some PowerShell with 
VBS
cript:
PS (1) > $vb = Call-VBScript
Calling the function gives you an object with the 
VBS
cript functions available as 
methods. First use the 
GetLength()
method to get the length of a string:
PS (2) > "Length of 'abcd' is " + $vb.getlength("abcd") 
Length of 'abcd' is 4
Now use the 
Add()
method, but use it inside a string expansion to illustrate how 
seamless this all is:
PS (3) > "2 + 5 is $($vb.add(2,5))" 
2 + 5 is 7 
PS (4) >
In the string expansion, the 
VBS
cript function is called to add the two numbers and 
return the result. The result is converted to a string and included in the expanded 
result string.
Listing18.6    The Call-VBScript function
DICOM to PDF Converter | Convert DICOM to PDF, Convert PDF to
Adobe Acrobat or any other print drivers when they use DICOM to PDF Converter. Additionally, high-quality image conversion of DICOM & PDF files in single page
change page order pdf preview; pdf change page order acrobat
BMP to PDF Converter | Convert Bitmap to PDF, Convert PDF to BMP
interface; Powerful image converter for Bitmap and PDF files; No need for Adobe Acrobat Reader & print driver during conversion; Support
how to move pages within a pdf document; reorder pages in pdf online
T
HE
WSH S
CRIPT
C
ONTROL
CLASS
785
18.5.2
Embedding JScript code in a PowerShell script
The script control also supports JScript, Microsoft’s implementation of 
ECMAS
cript 
(JavaScript). This listing shows the same example but using 
JS
cript.
function Call-JScript 
{
$sc = New-Object -ComObject ScriptControl
$sc.Language = 'JScript'                     
$sc.AddCode('                     
function getLength(s)
{
return s.length
}
function Add(x, y)
{
return x + y
}
')
$sc.CodeObject            
}
First, you create the script control, this time specifying that the language is 
JS
cript 
B
Then you add the code to define your functions 
c
and finally return the object
d
containing your functions. You call this function to get the code object back:
PS (4) > $js = Call-JScript
When you run the functions on this object, you get the same results you did in the 
VBS
cript example:
PS (5) > "Length of 'abcd' is " + $js.getlength("abcd") 
Length of 'abcd' is 4 
PS (6) > "2 + 5 is $($js.add(2,5))" 
2 + 5 is 7
This time, the 
JS
cript functions are called to return the results to PowerShell for display.
Our last example with the 
ScriptControl
mixes everything together. In a one-
line script (command line), you can mix PowerShell, 
VBS
cript, and 
JS
cript. In fact, 
you can have three languages all in one expression:
PS (7) > "The answer is " + 
>> $js.add($vb.getlength("hello"),2) * 6 
>>
The answer is 42 
PS (8) >
This example illustrates the basics of how to use the script control from PowerShell. 
Although we could continue to explore this type of embedding for quite some time, 
there’s one final, important 
COM
example we need to cover. A common requirement 
for many management operations is the ability to schedule tasks to be run either on a
Listing 18.7    The Call-JScript function
Specify 
JScript
b
Add code
c
Return 
CodeObject
d
786
CHAPTER 18
W
ORKING
WITH
COM
reoccurring schedule or when a particular event occurs. For example, backup and 
housekeeping activities are usually scheduled to run late at night. In the next section, 
you’ll see how to do this kind of scheduling using PowerShell.
18.6
W
ORKING
WITH
THE
W
INDOWS
T
ASK
S
CHEDULER
In this section, you’ll learn how to use PowerShell to create, list, and manage Win-
dows Task Scheduler tasks.
NOTE
These examples will only work on Windows Vista/Server 2008 
or above. Starting with those releases, the Windows Task Scheduler 
was significantly enhanced, adding many new features.
The 
COM
class you need to work with the Task Scheduler is 
Schedule.Service
This class allows you to create and schedule tasks, get a list of running tasks, and 
delete task definitions. In this example, our goal is to schedule a task that will start a 
PowerShell.exe
process in 30 seconds from the time the task is created. This 
PowerShell command will open a console window and then execute some script code 
that will slowly count up from 1 to 10. Once it reaches 10, it’ll wait for quite a long 
time so the Task Scheduler will be forced to shut that task down. Let’s walk through 
the commands to do this.
18.6.1
Getting started with the Schedule.Service class
First, you need to use 
New-Object
to get an instance of the 
Schedule.Service 
object. Using 
Get-Member
as always, you look to see what this class can do for you:
PS (2) > $ts = New-Object -ComObject Schedule.Service 
PS (3) > $ts | Get-Member
TypeName: System.__ComObject#{2faba4c7-4da9-4013-9697-20cc3fd40f85}
Name            MemberType Definition 
----            ---------- ----------
Connect         Method     void Connect (Variant, Variant, Variant... 
GetFolder       Method     ITaskFolder GetFolder (string) 
GetRunningTasks Method     IRunningTaskCollection GetRunningTasks ... 
NewTask         Method     ITaskDefinition NewTask (uint)
Connected       Property   bool Connected () {get}
ConnectedDomain Property   string ConnectedDomain () {get} 
ConnectedUser   Property   string ConnectedUser () {get} 
HighestVersion  Property   uint HighestVersion () {get} 
TargetServer    Property   string TargetServer () {get}
W
ORKING
WITH
THE
W
INDOWS
T
ASK
S
CHEDULER
787
The method names provide a reasonably clear description of the basic operations you 
can perform. More detailed descriptions are shown in table 18.2.
18.6.2
Listing running tasks
Let’s connect to the Task Scheduler on the local machine and list the running tasks:
PS (4) > $ts.Connect()
PS (5) > $ts.GetRunningTasks(0)
Name          : UserTask 
InstanceGuid  : {115A7A03-36B5-4937-8E23-E08B6E974488}
Path          : \Microsoft\Windows\CertificateServicesClient\UserTask 
State         : 4 
CurrentAction : Certificate Services Client Task Handler 
EnginePID     : 4784
Name          : TMM 
InstanceGuid  : {6433D865-3D03-4F62-B70D-D8E314799EBB} 
Path          : \Microsoft\Windows\MobilePC\TMM 
State         : 4 
CurrentAction : Transient Multi-Monitor Manager 
EnginePID     : 4784
Name          : SystemSoundsService 
InstanceGuid  : {266F6DD9-8A1F-4C00-B62A-8CF0A47D4359}
Path          : \Microsoft\Windows\Multimedia\SystemSoundsService 
State         : 4 
CurrentAction : Microsoft PlaySoundService Class 
EnginePID     : 4784
You can see that there are three tasks running currently: 
UserTask
TMM
, and 
System-
SoundsService
. Because there may be more than one instance of a task running at any 
given time, each task instance is uniquely identified by the 
InstanceGUID
field. You’ll 
get  to the path field  in a minute, but the other interesting field to notice is the 
CurrentAction
field. Each task has one or more triggers (events that start the task) and 
one or more actions (operations performed by the task when it’s triggered). Let’s see 
how to build a new task definition using the 
Schedule.Service
object.
Table 18.2 The list of basic methods for the Windows Task Scheduler COM object
Schedule.Service method 
Description
Connect()
Connect to the local or remote computer. Calling the method with 
no arguments connects to the local service.
GetRunningTasks()
Get a list of the currently running tasks (which is not the same as 
the currently defined tasks). Not all definitions may be running at 
any given time.
NewTask()
Create a new task definition.
788
CHAPTER 18
W
ORKING
WITH
COM
18.6.3
Creating a new scheduled task
To create a new task definition, you start by calling the 
NewTask()
method:
PS (8) > $nt = $ts.NewTask(0)
NOTE
People often ask what the 0 passed to 
NewTask()
stands for. 
The answer currently is nothing. This method argument is reserved for 
future use, and all current scripts and programs should always pass 0.
Once you have the task object, you can begin to configure it starting with informa-
tion that will be used to identify the task once it’s registered. To set up this informa-
tion, you need to get the registration object returned by the 
RegistrationInfo 
property on the new task object:
PS (9) > $ri = $nt.RegistrationInfo
With this object, you can set the 
Description
and 
Author
fields to help identify 
this task definition:
PS (10) > $ri.Description = "Count to 10"
PS (11) > $ri.Author = "Bruce Payette"
Next, you have to  establish  the  circumstances under  which the task will be run. 
Because you want to see the window displayed on the screen, you’re going to set the 
LogonType
to be 3 (interactive):
PS (12) > $principal = $nt.Principal
PS (13) > $principal.LogonType = 3
Now you need to establish when the task will be run by creating some triggers. The 
numeric argument that’s passed in indicates the type of trigger to create. In this case, 
you want to create a 
TimeTrigger
, which is specified by passing 1 to the API:
PS (14) > $trigger = $nt.Triggers.Create(1)
To set the start and stop times for this task, you’ll have to write a small function to 
convert a .
NET
time string into the format required by the Task Scheduler. This for-
mat is almost the same as .
NET
’s string representation of the 
UTC
time except that 
there’s a space in the .
NET
string where the Task Scheduler expects the letter 
T
. To fix 
this, you can use the 
-replace
operator to substitute 
T
for 
' '
:
PS (15) > function XmlTime ([datetime] $d) 
>> { 
>>   $d.ToUniversalTime().ToString("u") -replace " ","T" 
>> } 
>>
Set the start and end boundary times to run the task:
PS (16) > $trigger.StartBoundary = XmlTime ((Get-Date).AddSeconds(30)) 
PS (17) > $trigger.EndBoundary = XmlTime ((Get-Date).AddMinutes(5))
W
ORKING
WITH
THE
W
INDOWS
T
ASK
S
CHEDULER
789
These settings mean that the task will trigger 30 seconds from now, but it must start 
before the 
EndBoundary
time is reached.
You want to limit how long the task can run by using the 
ExecutionTimeLimit 
property. Limit the execution time to one minute:
PS (18) > $trigger.ExecutionTimeLimit = "PT1M"    # One minute
Set the trigger 
Id
string to identify the trigger. Remember that there may be more 
than one trigger, in which case this field helps you to tell them apart:
PS (19) > $trigger.Id = "Trigger in 30 seconds"
Finally you enable the trigger:
PS (20) > $trigger.Enabled = $true
In order for the task to do anything when it triggers, you’ll also need to define an 
action object for the task. Do so with the 
Actions.Create()
method:
PS (21) > $action = $nt.Actions.Create(0)
As with the 
NewTask()
call, the argument to this function is reserved for future use 
and currently must always be 0. Next you’ll set up the action to take and any argu-
ments to that action: 
PS (22) > $action.Path = @(Get-Command powershell.exe)[0].Definition 
PS (23) > $action.Arguments = @' 
>>   foreach ($i in 1..10) { $i; sleep 1 }; sleep 1000 
>> '@ 
>>
These commands specify the executable to run (
PowerShell.exe
) and the argu-
ments to pass to it when the process is launched.
Now you come to the 
Folder
object. This object is used to control where the 
task is stored. Task Scheduler definitions are organized in a hierarchy of folders like 
the file system. This allows you to organize related sets of tasks in their own folder. 
The following command  retrieves an  object  that  represents  the root  of  the  task 
folder hierarchy:
PS (24) > $tsFolder = $ts.GetFolder("\")
Once you have this object, you can use it to navigate the task tree and create new 
folders in that tree. But to keep the current example simple, just create the task in the 
root of the task definition tree.
18.6.4
Credentials and scheduled tasks 
The final thing you need before you can register this task is to specify the credentials 
to use when running the task. These credentials are passed to the API used to register 
a task 
RegisterTaskDefinition()
, which will store them for later use when the
Documents you may be interested
Documents you may be interested