c# pdf parse table : Batch update pdf metadata SDK software project winforms wpf web page UWP XFRXDevGuide1-part822

- 11 - 
5.4  Two versions of XFRXLIB.FLL 
There are two versions of XFRXLIB.FLL available that you can use with XFRX. The 
reason of this is that the “normal” XFRXLIB.FLL version requires three other DLL 
libraries from Microsoft to be installed on the target computers: gdiplus.dll, msvcr71.dll 
and msvcp71.dll. If you try to use XFRX with XFRXLIB.FLL without these DLLs 
installed, SetParams method will return -6, “xfrxlib.fll cannot be loaded (it is missing or 
invalid)”.  
All of these dll libraries can be downloaded from Eqeus or Microsoft website:  
msvcr71.dll - Microsoft Visual C++ 7.1 runtime library. If it is not installed on your 
pc, you can download it from http://www.eqeus.com/files/msvcr71.zip
msvcp71.dll – Microsoft Visual C++ 7.1 runtime library. You can download it 
from: http://www.eqeus.com/files/msvcp71.zip
gdiplus.dll - This DLL is included with Windows XP and if it is not available on 
your pc, you can download it from 
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdkredist.htm
These libraries can be distributed with your application (they are also distributed with 
VFP 9.0), but sometimes you may not need the gdiplus features in XFRXLIB.FLL and it 
may be easier to use a no-gdi+ version of XFRXLIB.FLL. This library is located in the 
NOGDIP subdirectory in the evaluation as well as commercial version package. 
The following table indicates features not available in the no-GDI+ version if XFRXLIB: 
GDI+ 
version 
No-GDI+ 
version 
Exporting reports as pictures 
Yes 
No 
Printing 
Yes 
No 
Supporting BMP and JPG pictures in PDF 
Yes 
Yes 
Supporting other picture formats in PDF 
Yes 
No 
Converting report pictures to defined DPI 
Yes 
No 
Exporting contents of general fields in VFP 9 
Yes 
No 
Exporting BMP and JPG pictures from general 
fields in VFP 8 
Yes 
Yes 
Binary comparison of images to reduce the size of 
PDF documents 
Yes 
Yes 
Batch update pdf metadata - add, remove, update PDF metadata in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Allow C# Developers to Read, Add, Edit, Update and Delete PDF Metadata
endnote pdf metadata; pdf keywords metadata
Batch update pdf metadata - VB.NET PDF metadata library: add, remove, update PDF metadata in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Enable VB.NET Users to Read, Write, Edit, Delete and Update PDF Document Metadata
search pdf metadata; batch pdf metadata
- 12 - 
6  Running XFRX 
When XFRX is run, it returns an instance of one of three classes, depending on a 
parameter passed. The available parameters are: 
1.
“XFRX#INIT” 
Running XFRX with this parameter will return the XFRXSession class instance, 
which is the main class that controls the behavior of XFRX in VFP 5, 6, 7 and 8. 
2.
“XFRX#LISTENER” 
This option is available in Visual FoxPro 9 only and returns an instance of 
XFRXListener class.  
3.
“XFRX#DRAW” 
This option returns an instance of XFRX#DRAW class. This class is used for 
working with XFF files. Please see Initializing the XFRX#DRAW class instance
chapter na stránce 44 for more information. 
Important note: The evaluation version of XFRX cannot be included into VFP 
projects, it makes VFP crash. To avoid this please invoke XFRX via macro substitution: 
loSession = EVALUATE("xfrx('XFRX#INIT')") 
This way XFRX.APP does not get into the project and you will be able to compile your 
application without problems. 
6.1  Running XFRX in VFP 5.0, 6.0, 7.0 and 8.0 
Please note: To make the text easier to read, the differences between XFRX for VFP 
5.0, 6.0, 7.0, 8.0 and XFRX for VFP 9.0 are further in the text described as differences 
between VFP 8.0 and VFP 9.0. If VFP 8.0 is mentioned, the described feature applies for 
VFP 5.0, 6.0 and 7.0 as well.  
1.
Call XFRX with "XFRX#INIT" as a parameter to obtain the XFRXSession object: 
loSession=XFRX("XFRX#INIT")
2.
Call SetParams method to set the document generation parameters. (Please see 
page 80 for details and full parameter list). 
3.
If  SetParams  return  0  (zero),  call  ProcessReport  method  for  each  report  to 
process. (Please see page 
91 for details and full parameter list). 
4.
After  all  reports  are  processed,  call  Finalize  method  to  finish  the  document 
generation process. 
5.
You can also call ResetPageNo() method if you need to reset the page number in 
between reports. 
VB.NET Create PDF from Excel Library to convert xlsx, xls to PDF
Extract Field Data. Data: Auto Fill-in Field Data. Field: Insert, Delete, Update Field. Professional .NET PDF converter component for batch conversion.
search pdf metadata; adding metadata to pdf
VB.NET PDF Convert to Jpeg SDK: Convert PDF to JPEG images in vb.
Data. Data: Auto Fill-in Field Data. Field: Insert, Delete, Update Field. Best and free VB.NET PDF to jpeg converter SDK for NET components to batch convert adobe
metadata in pdf documents; add metadata to pdf programmatically
- 13 - 
Example 1: 
This code merges two reports –  report1 and report2 – into a single PDF document, 
output.pdf 
use demoreps\invoices order customer 
local loSession, lnRetval 
loSession= xfrx("XFRX#INIT") 
lnRetVal = loSession.SetParams("output.pdf",,,,,,"PDF") 
If lnRetVal = 0 
loSession.ProcessReport("report1") 
loSession.ProcessReport("report2")  
loSession.finalize() 
Else 
? lnRetVal 
Endif 
6.2  Running XFRX in VFP 9.0 
In VFP 9.0, the standard object-assisted mode is used to run XFRX: 
1.
Call XFRX.APP with "XFRX#INIT" as a parameter to obtain the XFRXListener 
object: 
loListener=XFRX("XFRX#LISTENER") 
2.
Now there are two options you can choose from: 
a.
Call loListener’s SetParams method that has exactly the same parameters 
and return values as the one in XFRXSession class. (Please see page 80 for 
details and full parameter list).  
b.
Or, you can fill in individual properties of loListener and run SetParams 
method without any parameters to make sure you can proceed to the next 
step. (Please see page 90 for full list of properties available). 
3.
Call the native REPORT FORM command with the new OBJECT clause for each 
report to process.  If more reports  are merged, include  NOPAGEEJECT clause 
with each REPORT FORM call but the last one. 
4.
Alternatively,  you  can  leave  the  NOPAGEEJECT  clause  in  the  last  REPORT 
FORM  command  as  well  (which  may  be  useful  is  some  scenarios)  and  call 
loListener.finalize() to finish the document generation. 
Note:  Even in VFP 9.0, you can initialize  the  XFRXSession class via “XFRX#INIT” 
parameter and use the XFRX’s own engine, rather than the native one. 
The following examples all do exactly the same (and they also do exactly the same as 
the example 1 above), showing various ways of calling XFRX in VFP 9.0: 
Example 2: 
VB.NET PDF Convert to Tiff SDK: Convert PDF to tiff images in vb.
NET control to batch convert PDF documents to Tiff format in Visual Basic. Qualified Tiff files are exported with high resolution in VB.NET.
pdf metadata viewer; read pdf metadata java
VB.NET PDF Convert to Word SDK: Convert PDF to Word library in vb.
project. Professional .NET library supports batch conversion in VB.NET. .NET control to export Word from multiple PDF files in VB.
pdf remove metadata; pdf metadata extract
- 14 - 
use demoreps\invoices order customer 
local loSession, lnRetval 
loxfrx = XFRX("XFRX#LISTENER") 
lnRetval = loxfrx.SetParams("output.pdf",,,,,,"PDF") 
IF lnRetval = 0 
REPORT FORM report1 OBJECT loxfrx NOPAGEEJECT 
REPORT FORM report2 OBJECT loxfrx 
ELSE 
? lnRetval 
endif 
Example 3: 
use demoreps\invoices order customer 
local loSession, lnRetval 
loxfrx = XFRX("XFRX#LISTENER") 
lnRetval = loxfrx.SetParams("output.pdf",,,,,,"PDF") 
IF lnRetval = 0 
REPORT FORM report1 OBJECT loxfrx NOPAGEEJECT 
REPORT FORM report2 OBJECT loxfrx NOPAGEEJECT 
Loxfrx.finalize() 
ELSE 
? lnRetval 
endif 
Example 4: 
use demoreps\invoices order customer 
local loSession, lnRetval 
loxfrx = XFRX("XFRX#LISTENER") 
loxfrx.targetType = "PDF" 
loxfrx.targetFileName = "output.pdf" 
lnRetval = loxfrx.SetParams() 
IF lnRetval = 0 
REPORT FORM report1 OBJECT loxfrx NOPAGEEJECT 
REPORT FORM report2 OBJECT loxfrx 
ELSE 
? lnRetval 
endif 
6.3  Using THISFORM and THIS references 
Note: This paragraph applies to VFP 8.0 only. THISFORM and THIS references are 
handled properly by the native report engine in VFP 9.0. 
XFRX supports  using  THISFORM  and THIS  in  the  expressions of  the  report fields. 
However, being normal VFP application, XFRX cannot access THISFORM and THIS 
objects  directly.  Instead,  THISFORM  object  has  to  be  explicitly  sent  to  XFRX  via 
setThisform() method, THIS  needs to  be sent via setThis()  method. The  use  is  very 
simple. 
VB.NET PDF File Merge Library: Merge, append PDF files in vb.net
Batch merge PDF documents in Visual Basic .NET class program. Merge two or several separate PDF files together and into one PDF document in VB.NET.
pdf metadata online; pdf metadata reader
C# PDF Convert to Tiff SDK: Convert PDF to tiff images in C#.net
Studio .NET project. Powerful .NET control to batch convert PDF documents to tiff format in Visual C# .NET program. Free library are
pdf xmp metadata viewer; modify pdf metadata
- 15 - 
If you have THISFORM in your report, call xfrxSession.setThisform(THISFORM) before 
calling ProcessReport(). If you are using THIS, call xfrxSession.setThis(THIS). 
6.4  GDI+ compatible word wrapping algorithm 
Since the introduction of VFP 9.0 we are experiencing layout compatibility issues 
between the old reporting engine (pre-VFP 9.0) and the new reporting engine (VFP 9.0). 
[Please see Guide to Reporting Improvements VFP 9.0 help topic for more 
information.]  
With XFRX we are experiencing a similar problem - while the pre-VFP 9.0 report engine 
inside XFRX is using GDI for wordwrapping and layout calculation, the VFP 9.0 report 
that is used in XFRX for VFP 9.0 is using GDI+. Moreover, XFRX is using GDI+ for 
printing, output to pictures and previewing. The main difference between using GDI and 
GDI+ is text width. Each text element is slightly wider with GDI+, which can result in 
element content being cut, earlier wrapping longer stretched fields. Here is a summary:  
XFRX ver. 12.3 and earlier 
VFP 9.0  VFP 8.0 and earlier 
Output to PDF and other output formats  GDI 
GDI 
Report engine  GDI+ 
GDI 
Report previewer  GDI+ 
GDI+ 
Printing out of XFRX  GDI+ 
GDI+ 
Although converting everything to GDI+ would ease the complexity, it would bring 
another problem - "old" reports might need to be modified. So, instead, the latest XFRX 
version now contains both GDI and GDI+ wordwrapping algorithms and you can choose 
which one is going to be used. By default GDI+ is used in VFP 9.0 in the listener mode 
and GDI is used in VFP 8.0 earlier. There is probably no reason to switch to GDI in VFP 
9.0 but it might sometimes be useful to switch to GDI+ as printing and previewing is still 
in GDI+:  
XFRX ver. 12.4 with wordwrapping set to GDI+ 
VFP 9.0  VFP 8.0 and earlier 
Output to PDF and other output formats  GDI+ 
GDI+ 
Report engine  GDI+ 
GDI+ 
Report previewer  GDI+ 
GDI+ 
Printing out of XFRX  GDI+ 
GDI+ 
XFRX ver. 12.4 with wordwrapping set to GDI 
VFP 9.0  VFP 8.0 and earlier 
Output to PDF and other output formats  GDI 
GDI 
Report engine  GDI+ 
GDI 
Report previewer  GDI+ 
GDI+ 
Printing out of XFRX  GDI+ 
GDI+ 
C# PDF Convert to Word SDK: Convert PDF to Word library in C#.net
Powerful components for batch converting PDF documents in C#.NET program. Convert PDF to multiple MS Word formats such as .doc and .docx.
view pdf metadata in explorer; add metadata to pdf file
C# PDF File Merge Library: Merge, append PDF files in C#.net, ASP.
NET components for batch combining PDF documents in C#.NET class. Powerful library dlls for mering PDF in both C#.NET WinForms and ASP.NET WebForms.
read pdf metadata online; delete metadata from pdf
- 16 - 
To set the wordwrapping algorithm manually then, before running your reports, create a 
public or private variable _xfrx_WordWrapAlgorithm and set it to 1 for GDI mode and 2 
for GDI+ mode.  
6.5  Text output trimming 
In VFP 9.0 the trim mode is controlled by the "Trim mode for character expressions" 
setting on the "Format" tab in the "Field Properties" form. 
In pre-VFP 9.0 version the trimming is controlled by a special string in fields comment: 
#UR TRIM=, followed by the trim mode code:  
Code 
Description 
 Default trimming in pre-VFP 9.0 versions - trim to nearest word 
 Trim to nearest character 
 Trim to nearest word 
 Trim to nearest character, append ellipsis 
 Trim to nearest word, append ellipsis 
 Show inner path as ellipsis 
Example: #UR TRIM=3 wraps to the nearest character and appends ellipsis  
6.6  Displaying progress bar in VFP 8.0 
XFRX provides a simple hook so that any progress bar tool could be used for displaying 
the progress during the document generation process. All you have to do is to create an 
object  which  contains  updateProgress()  method  and  pass  it  to  XFRX.  During  the 
generation process, XFRX calls updateProgress() method either after each page or after 
each record is processed.  
This is a simple example of displaying the generation progress in a wait window:  
loSession=xfrx("XFRX#Init") 
loProgress = createobject("progress") 
lnRetVal = loSession.SetParams("document",,,,,,"PDF") 
if lnRetVal = 0 
loSession.setProgressObj(loProgress,2) 
loSession.ProcessReport("myReport") 
loSession.finalize() 
endif 
define class progress as custom 
procedure updateProgress 
lpara ta,tb, tc 
wait window nowait "Page #: "+allt(str(tb))+" Report #: 
"+allt(str(ta))+" ("+allt(str(tc))+"%)" 
enddef 
- 17 - 
The progress object is attached to XFRX with setProgressObj() method. This method 
takes  two  parameteres  -  the  first one  is  the  progress  object,  the  second  defines the 
information the updateProgress() will be getting. It can contain two values: 1 - only page 
number and report number will be provided in updateProgress() method, or 2 - page 
number,  report  number  and  percentage  progress  within  the  current  report  will  be 
provided. Using the percentage progress information is more accurate and more suitable 
for progress bar visualization, but to provide this, XFRX has to calculate the number of 
records in the processed table, which, sometimes, can be very time demanding. In this 
cases,  1  can  be  used  not  to  calculate  the  number  of  records.  
The updateProgress method takes three parameteres: current report number, current 
page number and actual percentage progress within the current report. 
6.7  Displaying progress bar in VFP 9.0 
In VFP 9.0, the XFRXListener  object  can be  chained  together  with  another listener 
which would take care of the progress bar displaying. One of the possible ways to do this 
is to use the UpdateListener class, which is shipped with VFP 9.0, in FFC. 
Example: 
This sample code creates an instance of the UpdateListener class and chains it with 
XFRXListener: 
loxfrx = XFRX("XFRX#LISTENER") 
SET CLASSLIB TO (HOME()+"FFC\_reportlistener.vcx") 
loUpdate = CREATEOBJECT("updatelistener") 
loUpdate.thermFormCaption = "Report in progress ..." 
loxfrx.successor = loUpdate 
lnRetval = loxfrx.setparams("output.pdf",,,,,,"PDF") 
IF lnRetval == 0 
REPORT FORM (lcReportName) OBJECT loxfrx NOPAGEEJECT 
loxfrx.finalize() 
ELSE 
? lnRetval 
endif 
6.8  Canceling report generation in progress 
Note: This paragraph applies both to VFP 9.0 and VFP 8.0 
The report generation process in progress can be canceled by setting the global variable 
gnStopXFRX to 1. For example, you can, for example, use it this way:  
ON KEY LABEL Ctrl+C gnStopXFRX = 1 
- 18 - 
6.9  Printing page ranges 
Note: This paragraph applies to VFP 8 only. In VFP 9.0, please use the RANGE clause 
of the REPORT FORM command to achieve the same. 
To define the page range, call setPageRange() method before calling calling 
ProcessReport(). There are two possible ways how to call the setPageRange() method:  
setPageRange(tnFrom, tnTo)  
tnFrom and tnTo define the from-to range. If tnTo is empty, the total number of 
pages is used  
Example:  
loSession.setPageRange(5,10) 
setPageRange(tcRange)  
tcRange is a string, which can contain page numbers and page ranges delimited 
by commas, the page range is defined as "from-to".  
Example:  
loSession.setPageRange("1,4,10-20,25") 
6.10 User-defined page size 
Note: This paragraph applies both to VFP 80. and VFP 9.0 
You can define the page size of the generated document. The user-defined page size will 
override the page size stored in the report. To define the user-defined page size, call 
setPaperSize() method with paper width and paper height as parameters:  
setPaperSize(nUDPaperWidth, nUDPaperHeight) 
The unit is Inch * 10000. 
See also: HTML page size adjustment na stránce 34. 
6.11 Zipping the generated files 
Note: This paragraph applies both to VFP 8.0 and VFP 9.0 
The generated file can be automatically zipped. This feature is controlled by the last 
three parameters of SetParams() method of XFRXSession and XFRXListener classes (see 
the reference na stránce 80) or, with an equivalent behavior, by the three parameters of 
ZipDocument() method of XFRXListener class (reference na stránce 90). 
Example: 
With  the  following  SetParams  parameters,  XFRX  first  creates  "invoices.pdf",  then 
creates "archive.zip" (if it doesn't exist) and adds "invoices.pdf" into the archive. Then 
the original "invoices.pdf" will be deleted:  
loSession.SetParams("invoices.pdf",,.T.,,,,"PDF","archive.zip", .t., .t.) 
- 19 - 
7  Interactive features 
The generated documents can include hyperlinks for faster navigation, PDF documents 
can also include bookmarks. The hyperlinks and bookmarks are controlled via Comment 
field of labels and fields. 
Please note: In the beta version of VFP 9 there is a bug that makes it impossible to 
store anything into fields’ comment. Because XFRX uses the comment field to define 
hyperlinks and bookmarks, the “User data” field is now used for this purpose. In the final 
version, XFRX for VFP 9 will work both with comment and user data field. 
7.1  Hyperlinks 
Note: This paragraph applies both to VFP 9 and VFP 8. 
The hyperlinks are controlled via Comment field of report labels or fields.  
To create a link, you need a source field (the underlined text you will navigate from) and 
a target field (the place where you get when you click on a hyperlink).  
o
Creating source fields 
Enter the following text into the comment of the source field:  
#UR A HREF=<destination name>  
The  destination  name  is  an  expression,  which  is  evaluated  at  the  time  of  report 
generation. You can navigate to other fields in the same document, or to any URL. The 
destination names of other fields in the same document has to be preceeded with #.  
Examples: 
#UR A HREF="#top" 
Navigates to the beginning of the document. "top" is a reserved word. Do not name 
target fields are "top". 
#UR A HREF="#custlist" 
Navigates to the field whose destination name is "custlist". 
#UR A HREF="#"+customer.id 
Navigates to the field whose destination name is eval(customer.id)  
#UR A HREF="http://www.eqeus.com" 
Navigates to Eqeus.com homepage 
- 20 - 
o
Creating target fields 
To add a destination name to a (target) field, add the following text into the comment:  
#UR A NAME=<destination name>  
Example: 
#UR A NAME=customer.id 
This field will be a target field for source fields with HREF="#"+customer.id 
7.2  Bookmarks 
Note: This paragraph applies both to VFP 9 and VFP 8. 
Note 2: Bookmarks are currently supported in PDF and HTML documents  
Bookmarks  (document  outline)  serves  as  a  "visual  table  of  contents"  to  display  the 
document structure. Users use this to interactively navigate in the document. To add a 
report field into the document outline simply put the following into the field's comment:  
#UR OUTLINE=<outline_name>  
The outline_name is an expression, which is evaluated at the time of report generation 
and the result is used as  the  bookmark item.  If  users click the bookmark, they  will 
navigate to the corresponding report field.  
Example: 
In a report with a list of invoices grouped by customers, bookmarks containing the list of 
customer can be created by adding  
#UR OUTLINE=invoices.customerName  
into the comment of a customer name field (or any other field you want to navigate to, 
e.g. the first field on a page with the customer).  
To enable bookmarks in the HTML output, call  
loSession.SetOtherParams("PRINT_BOOKMARKS",.t.)  
before calling loSession.ProcessReport()  
With bookmarks enabled, XFRX will generate three HTML pages (three files): the main 
page defining the page frames, the bookmark page and the page with the report output. 
Documents you may be interested
Documents you may be interested