how to use pdfdocument class in c# : Add a link to a pdf control software system azure winforms asp.net console WATUsageGuide10-part851

Design Studio User's Guide
99
Table 7. Copy harvest data to production tables
Scenario
Description
Repository
matching  website
(small data sets)
The idea is to have a repository that matches the items on a website 1-to-1.
The easiest way to accomplish this is have a production table, that is truncated
(deleting all rows) every time the robot is done executing, and then copy every record
from the harvest table where ExtractedInLastRun='y' into this table. This works well
for small data sets.
Repository
matching  website
(large data sets)
Same as above, but the data set is too large to copy all data after every robot
execution, instead we want to update the production table after each robot execution
based on the changes which have occurred.
This is where the LastUpdated field comes in handy. All values which have been
updated, will have a LastUpdated field value larger than the start time of the robot.
You can get the start time from the database logging tables, or you can have the
robot store it somewhere.
You can detect deleted values like this SELECT  *  FROM  table  WHERE
LastUpdated > 'StartTime' AND ExtractedInLastRun = 'n'
You can detect new  values like this SELECT  *  FROM  table  WHERE
LastUpdated > 'StartTime' AND ExtractedInLastRun = 'y'
AND FirstExtracted > 'StartTime'
You can detect updated values like this SELECT  *  FROM  table  WHERE
LastUpdated > 'StartTime' AND ExtractedInLastRun = 'y'
AND FirstExtracted < 'StartTime'
Then update your Production table accordingly.
Historic data
The default setup allows you to see when a value was first extracted and when it
was last updated, but you cannot see if it was found in the 5th, 7th and 10th run of
the robot, but not in the 6th and 8th run.
In this case, you should copy all the data from your harvest table into another table
after the robot run, but in your new table the ObjectKey should not be a primary
key. Instead create an extra column called RUN_ID and use it together with the
ObjectKey to create a compound primary key. If you don't need a RUN_ID you
could simply create an auto incremented column and use that as the primary key of
your secondary table. Truncate the harvest table before each run.
You don't have to copy all the house-hold fields to your production table, only the ObjectKey is required
for you to update your production tables.
Concurrency considerations
If you have multiple robots storing values of the same type to the same database there are a few things
you should be aware of.
• Every time a value is stored, the RobotName column is updated. If you have two robots storing the
'same' value (as identified by ObjectKey), only the last one will show after the robots are done executing.
• If two robots store the same value at 'exactly' the same time, you will get an error. They will both find
that the value is not in the table, and try to insert it, but only one of them will succeed. In most cases the
error can simply be ignored as it is in fact precisely the same value.
Add a link to a pdf - insert, remove PDF links in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Free C# example code is offered for users to edit PDF document hyperlink (url), like inserting and deleting
add hyperlink to pdf online; pdf link open in new window
Add a link to a pdf - VB.NET PDF url edit library: insert, remove PDF links in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Help to Insert a Hyperlink to Specified PDF Document Page
pdf link to attached file; add page number to pdf hyperlink
Design Studio User's Guide
100
• If you run the same robot twice at the same time and the robot stores data in a database, you break the
way the ExtractedInLastRun column is used!
When the first robot is done executing, it will update the ExtractedInLastRun to 'n' for all values it
has not stored. This includes all values stored by the second robot so far. Later when the second robot
finishes, it will set ExtractedInLastRun to 'n' for all values stored by the first robot, completely negating
the first run.
Value Relations
The storage system does not provide an automated way of managing relations between values. If you have
a value of type Person and one of type Address, and you want to link them, you will have to maintain
this link.
The easiest way to create a link is to have the ObjectKey of then Person value be a foreign key in the
Address value which should be linked to this person.
If the ObjectKey is calculated automatically from the type, you can use the Calculate ObjectKey action,
to generate the key and assign it to each of the address values before you store them.
You should be careful when building robots with relations between stored values. If an error occurs when
you store the Person value, you should make sure that no Address values are stored.
ObjectKey Caveats
If you are using MySQL, Oracle or Sybase, you should be aware of the following with regards to
ObjectKeys.
• On Oracle empty string is stored as null.
• On Sybase empty string is store as " " (a string with a single space).
• MySQL doesn't have millisecond precision on timestamps.
These three cases all result in a potential loss of data when the data is stored in the database. The ObjectKey
is calculate inside the robot based on the data in the given variable, if you later load the value from the
database and try to recalculate the ObjectKey, the ObjectKey will be different if data loss occurred in any
of the attributes marked as part of database key.
Putting It All Together
By now, you have been introduced to the major concepts in Design Studio, you have taken a tour of the
Design Studio user interface, you know the concepts of robots, types, step actions and data converters, and
you have a feel of what patterns and expressions are.
Let us now put all this Design Studio-knowledge into use and make some robots. However, first we need
an overview of how robots are normally built — that is, their structure.
Robots mimic human behavior — that is, they do (more or less) what you do when you are looking for
content on the Internet using a browser: You start by searching for the content. Once found, you read
and process it. Similarly, most robots can be roughly divided into two parts: A navigation part and an
extraction part.
Navigation is concerned with "getting to where the content is." Navigation mainly includes loading pages
and submitting forms. When navigating in Design Studio, you typically use the Click action to navigate
to and between web pages.
RasterEdge .NET Document Imaging Trial Package Download Link.
Extract; C# Read: PDF Image Extract; C# Write: Insert text into PDF; C# Write: Add Image to PDF; C# Protect: Add Password to PDF; C#
add hyperlink to pdf in; add a link to a pdf
C# PDF Library SDK to view, edit, convert, process PDF file for C#
editing PDF document hyperlink (url) and quick navigation link in PDF bookmark. C#.NET: Edit PDF Metadata. PDF SDK for .NET allows you to read, add, edit, update
add links pdf document; add hyperlink pdf file
Design Studio User's Guide
101
Extraction is concerned with "getting the right content." Extraction mainly includes selecting, copying,
and normalizing content from a web page that you have navigated to. When extracting in Design Studio,
you typically use the Test Tag action to skip uninteresting ("noisy") content, the Extract action to copy
content into variables, and the data converters for normalizing the content so that it gets the format you
want, e.g. the right date and number format. Once extracted, you output the value with the "Store in
Database" or "Return Value" action.
So, the typical robot starts with one or more steps, each containing a Load Page or Click action, in order
navigate to the interesting content on some web site. It proceeds with one or more steps, each containing
an Extract action, and ends with a step storing or returning the extracted value.
Note that in many robots the navigation and extraction parts overlap because the content to extract is
located on several pages. Again, this is similar to when you look for content yourself; often, you have to
visit several pages to get the content you want.
Most robots include other actions than the ones mentioned above, e.g. a For Each Tag action for loading
several similar looking pages or extracting values from several similar looking table rows. Because robots
have different tasks, they have different needs. For this reason, we have included a considerable number
of step actions and data converters in Design Studio. Start with familiarizing yourself with the basic and
most commonly used step actions and data converters, and then begin to explore. Experience shows that
one can create most robots using only a handful of step actions and data converters. So, find your own
favorite step actions and data converters and stick to them until you feel a need to explore others.
How to Write Well-Structured Robots
A robot is a program so writing well-structured robots is important for the same reasons as it is for writing
programs in other programming languages. Writing unstructured robots is like writing books with no
chapters and no table of contents. So writing well-structured robots is important because:
• it helps document the robots
• it makes it easier to maintain the robots
• it makes it easier to find your way around the robots
A side-effect of writing well-structured robots is that it often also makes robots load faster in Design Studio
and generally be more responsive when edited, e.g. when updating the Robot View.
The two main 'tools' that you have at your disposal to write well-structured robots are: Snippet steps and
Group steps. Both these two types of steps are used as a way to take a part of a robot, give it a descriptive
name and let you pack it up in a single step. In this way you can forget what the part of the robot does in
detail and concentrate on other issues of you robot. This is very similar to other concepts found in other
programming languages, e.g. methods, function, procedures, etc.
You use a group step to pack up and hide steps that performs a well-defined task that you can give a
descriptive name, e.g. Login to site X, Report error. It is important that you can give a relatively short
descriptive name to the group step that describes what the steps inside the group does. If you can't then it
is probably because they do not perform a well-defined task. Introducing a group step you help document
your robot, because the name describes what that part of the robot does.
Although snippet is mainly introduced to share functionality between robots they can also be used inside a
single robot to help structure this. If you have a collection of steps in robot that is used in several branches,
e.g. by having edges from different part of the robot joining at the start of the steps, you can replace this
kind of sharing of steps by introducing a snippet containing the steps.
Let us look at a simple example of one way one may structure a robot using snippets and groups instead
of joining edges. Assume that our robot that looks like this:
C# PDF insert image Library: insert images into PDF in C#.net, ASP
C#.NET PDF SDK - Add Image to PDF Page in C#.NET. How to Insert & Add Image, Picture or Logo on PDF Page Using C#.NET. Add Image to PDF Page Using C#.NET.
adding an email link to a pdf; convert doc to pdf with hyperlinks
VB.NET PDF insert image library: insert images into PDF in vb.net
VB.NET PDF - Add Image to PDF Page in VB.NET. Guide VB.NET Programmers How to Add Images in PDF Document Using XDoc.PDF SDK for VB.NET.
add hyperlink in pdf; add link to pdf acrobat
Design Studio User's Guide
102
Sharing steps using joining edges
The last two steps c an d is shared by the two branches starting with the steps a and c. In real life you
probably have a much larger robot and more than two branches sharing steps in this way and the steps
involved may be far apart. This may result in the robot being very hard get an overview of. As a first step
towards getting a better structured robot we introduce a snippet step containing the steps c and d. This
looks like this:
Sharing steps using a snippet
We can now edit the steps inside the snippet steps and still be sure that our changes are shared in the two
branches. We can also further structure our robot by putting each of two branches into a group step:
Grouping the branches steps
VB.NET PDF Password Library: add, remove, edit PDF file password
VB: Add Password to PDF with Permission Settings Applied. This VB.NET example shows how to add PDF file password with access permission setting.
adding hyperlinks to pdf files; convert excel to pdf with hyperlinks
C# PDF Password Library: add, remove, edit PDF file password in C#
C# Sample Code: Add Password to PDF with Permission Settings Applied in C#.NET. This example shows how to add PDF file password with access permission setting.
change link in pdf; add email link to pdf
Design Studio User's Guide
103
Finally, if we close the two group steps we get the following simple robot:
The final result of the restructuring
This resulting robot does two task, one performed by Group1 and the other performed by Group2. By
giving these two groups descriptive names the robot has a more logical structure than the original robot.
Admittedly this is a very simple example, but when robots gets beyond a certain size and contains edges
crisscrossing the Robot View it is very easy to lose overview of the robot giving a whole new meaning
to the word spaghetti code. Restructuring the robot in the manner describe above may help regain that
overview.
How to Determine the Type of a Page
When loading a page e.g. by clicking on a link in an HTML page you cannot be sure that the page that
gets loaded is another HTML page. The loaded page could be an XML page, an Excel page or a page
of some content type that Design Studio does not support. So how do you in a robot test what the page
type of a loaded page is such that you can add branches to handle each page type separately? You do this
using the Test Page Type step.
The Test Page Type step tests the type of the page in the current window and there are currently four page
types: HTML, XML, Excel and Binary. The figure below shows a piece of a robot that tests for the four
different page types. This consists of a Try step followed by four branches where each branch starts with
a Test Page Type step configured to test for a each their page type. The names of the Test Page Type steps
have been change to indicate what their page type is.
How to C#: Basic SDK Concept of XDoc.PDF for .NET
You may add PDF document protection functionality into your C# of PDF document, including editing PDF url links and quick navigation link in bookmark
pdf edit hyperlink; add a link to a pdf in preview
VB.NET PDF: Basic SDK Concept of XDoc.PDF
You may add PDF document protection functionality into your VB.NET of PDF document, including editing PDF url links and quick navigation link in bookmark
pdf edit hyperlink; add hyperlink to pdf in preview
Design Studio User's Guide
104
Steps That Test the Page Type
How to Use the Tag Finders
A Tag Finder is used to find a tag on a page. The most common use of a Tag Finder is in a step, where the
Tag Finder is used to find a tag on which the selected action should be applied. The list of Tag Finders of
the current step is located in the "Tag Finders" tab in the Step View, and is shown below.
Design Studio User's Guide
105
The Finders Tab in the Step View
Understanding Tag Paths
To understand the Tag Finder, the concept of a tag path  is important. A tag path is a compact text
representation of where some tag is located on a page. Consider this tag path:
html.body.div.a
This tag path refers to an <a>-tag inside a <div>-tag inside a <body>-tag inside an <html>-tag.
A tag path can match more than one tag on the same page. For example, the tag path above will match all
of the <a>-tags on this page, except the third one:
<html>
Design Studio User's Guide
106
<body>
<div>
<a href="url...">Link 1</a>
<a href="url...">Link 2</a>
</div>
<p>
<a href="url...">Link 3</a>
</p>
<div>
<a href="url...">Link 4</a>
<a href="url...">Link 5</a>
<a href="url...">Link 6</a>
</div>
</body>
</html>
You can use indexes to refer to specific tags among tags of the same type at that level. Consider this tag
path:
html.body.div[1].a[0]
This tag path refers to the first <a>-tag in the second <div>-tag in a <body>-tag inside an <html>-tag. So,
on the page above, this tag path would only match the "Link 4" <a>-tag. Note that indexes in tag paths
start from 0. If no index is specified for a given tag on a tag path, the path matches any tag of that type
at that level, as we saw in the first tag path above. If the index is negative, the matching tags are counted
backwards, i.e. starting with the last matching tag which corresponds to index -1. Consider this tag path:
html.body.div[-1].a[-2]
This tag path refers to the second-to-last <a>-tag in the last <div>-tag in a <body>-tag inside an <html>-tag.
So, on the page above, this tag path would only match the "Link 5" <a>-tag.
You can use an asterisk (‘*') to mean any number of tags of any type. For example, the tag path
html.*.table.*.a
refers to an <a>-tag located anywhere inside a <table>-tag, which itself can be located anywhere inside an
<html>-tag. There is an implicit asterisk in front of any tag path, so you can simply write "table" instead of
"*.table" to refer to any table tag on the page. The only exception is tag paths starting with a punctuation
mark (‘.'), which means that there is no implicit asterisk in front of the tag path, so the tag path must match
from the first (i.e. top-level) tag of the page.
With asterisks, you can create tag paths that are more robust against changes in the page, since you can
leave out insignificant tags that are liable to change over time, such as layout related tags. However, using
asterisks also increases the risk of accidentally locating the wrong tag.
You can provide a list of possible tags by separating them with '|', as in this tag path:
html.*.p|div|td.a
This tag path refers to an <a>-tag inside a <p>-, <div>-, or <td>-tag located anywhere inside an <html>-tag.
In a tag path, text on a page is referred to just as any other tag, using the keyword "text". Although text is
not technically a tag, it is treated and viewed as such in a tag path. For example, consider this HTML:
Design Studio User's Guide
107
<html>
<body>
<a href="url...">Link 1</a>
<a href="url...">Link 2</a>
</body>
</html>
The tag path "html.body.a[1].text" would refer to the text "Link 2".
How the Tag Finder Works
A Tag Finder can be configured using the following properties:
Find Where:
In this property, you can specify where to find the tag relative to a named tag.
The default value is "Anywhere in Page", meaning that named tags are not used
to find the tag.
Tag Path:
In this property, you can specify the tag path as described in the previous section.
Attribute Name:
In this property, you can specify that the tag must have a specific attribute, for
example "align".
Attribute Value:
In this property, you can specify that the tag must have an attribute with a
specific value. If the Attribute Name property is set, the attribute value is bound
to that specific attribute name.
• "Equals Text" specifies that the attribute value must match a specified text.
Note that the text must match the entire attribute value.
• "Containing Text" specifies that the attribute value must contain the specified
text.
• "Pattern" specifies that the attribute value must match a pattern. Note that the
pattern must match the entire attribute value.
Tag Pattern:
In this property, you can specify a pattern that the tag must match (including
all tags inside it), for example ".*<b>.*Stock Quotes.*</b>.*". Some caution
should be observed in using this property, since it can have considerable impact
on the performance of you robot. This is because the "Tag Pattern" may be
applied many times throughout a page just to find the one tag that it matches.
One way to try and avoid this is to choose "Text Only" for the "Match Against"
property.
Match Against:
In this property, you can specify that the "Tag Pattern" should match only the
text or the entire HTML of the tag. The default is to match only the text because
this is normally much faster.
Tag Depth:
This property determines which tag to use if matching tags are contained inside
each other. The default value is "Any Depth" which accepts all matching tags. If
you select "Outermost Tag", only the outermost tags are accepted, and similarly,
if you select "Innermost Tag", only the innermost tags are accepted.
Tag Number:
This property determines which tag to use if more than one tag match the tag
path and the other criteria. You specify the number of the tag to use, either
Design Studio User's Guide
108
counting forwards from the first tag or counting backwards from the last tag
that matches.
For example, if you set the tag path to "table", the Tag Attribute property to "align=center", and the Tag
Pattern property to ".*Business News.*", then the Tag Finder would locate the first <table>-tag that is
center aligned and that contains the text "Business News".
Configuring the Tag Finders of the Current Step
In the Robot Editor, you can configure the Tag Finders of the current step in several ways. The first way
is to configure it manually. Once configured (whether automatically or manually), you can click the  icon
in the Page View to see the tag found by the Tag Finder.
The second way to configure the Tag Finders is to select a tag in the Page View and click the  icon. This
will configure the Tag Finder to find the selected tag using a tag path in simple mode.
The third way is to right-click on a tag in the Page View and then select an action from the pop-up menu that
appears. If you select "Use Tag" from the menu, the Tag Finder will be configured to find the right-clicked
tag using a tag path in simple mode. Similarly, if you choose another action from the menu, this will select
a corresponding step action and configure the Tag Finder to find the right-clicked tag.
The fourth way to configure the Tag Finders is to select a new step action. Some actions, when selected,
configure the Tag Finders so that they find the tags typically used for that action. For example, the Submit
Form action will use one Tag Finder and set its tag path to "form" to locate the first <form>-tag in the page.
How to Submit a Form
Submitting a form is a common task in a robot. For example, you may need to submit a search form to
get the search results that you want to extract, or you may need to submit an order form to make an order
transaction. In some cases, you do not need to actually submit the form, but simply want to create a URL
that represents the form submission, or modify the current values in the form. In this section, you will
learn how to do these things.
Simple Form Submission
The recommended and simplest way of submitting a form in Design Studio is similar to the way you submit
a form in an ordinary browser: First fill in the form and then click the form submission button.
To fill in the form, you can use the following actions:
• Enter Text
• Enter Password
• Select Option
• Select Multiple Options
• Set Checkbox
• Select Radio Button
and to submit the form, you can use the Click action.
Documents you may be interested
Documents you may be interested