Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 10 Next »

PDF Encryption

This paragraph applies both to VFP 9 and VFP 8. The setPasswords method is implemented both in XFRXListener and XFRXSession classes.

PDF documents can be encrypted. To set the encryption on, call setPasswords method:

loSession.setPasswords(tcOwnerPassword, tcUserPassword)

The user password can be empty. If the owner password is empty, a random string will be generated as the password.

The owner can do anything with the document. The user permissions can be set using the setPermission method:

loSession.setPermissions(tlPrintDocument, ;
                             tlModifyDocument, ;
                                    tlCopyTextAndGraphics, ;
                                    tlAddOrModifyAnnotations)

The default values of the permissions is .F. (false). 

PDF Font Embedding

This paragraph applies both to VFP 9 and VFP 8. The method is implemented both in XFRXListener and XFRXSession classes.

XFRX supports both whole font and font subset embedding.

To embed all characters of all used fonts, call:

loSession.setEmbeddingType(2)

before running the report.

To embed only the characters used, call:

loSession.setEmbeddingType(3)

Embedding only subset of fonts (characters used in the document) significantly reduces the size of the generated file.

To select which font to embed (e.g. when you need just to embed the barcode font, or font that is not installed on the pc the document will be sent to), add “#UR INCLUDEFONT” (without the quotation marks) to the comments of a field that uses the font (in the report). Add “#UR INCLUDEFONT SUBSET” comment to include the font subset.

Object rotation

This paragraph applies both to VFP 9 and VFP 8.

To rotate a text or a picture in PDF output, add “#UR ROTATE” (without the quotation marks) to the comment of the report field. The text or the picture will rotate counterclockwise by the entered angle, e.g. to print vertically, add: “#UR ROTATE 90”.

Appending generated output to existing PDF Documents

This paragraph applies both to VFP 9 and VFP 8.

From version 10.1, XFRX is able to append the generated report to an existing PDF document. It is possible to append the report at the end of the document or at an arbitrary position within the document: with either inserting the new pages or replacing the pages in the existing PDF document.

In XFRX for VFP 8 this feature is controlled by a new parameter of SetParams(…) method: tuAppend. Please see the SetParams method reference na stránce 80 for more information about setting this parameter.

In XFRX for VFP 9 you can interchangeably use the new parameter of SetParams(…) method or AppendToFile property of the XFRXListener class.

Notes

  1. It's not guaranteed that XFRX will be able to append to any PDF document. It works fine with PDF documents generated by XFRX and we've successfully tested PDFs from other sources, too, but the PDF specification allows for some internal structures that XFRX wouldn't be able to decode. (To be precise: XFRX doesn’t support linearized PDF documents and documents that use page tree structures).
  2. Because of the way the PDF file is constructed, the size of the PDF document never shrinks, even if the number of pages in the resulting PDF document is smaller than in the original one.

Example: The TEST.FRX report will be appended to the existing TEST.PDF document. If the TEST.PDF file does not exist, it will be created.

Oxfrx = XFRX("XFRX#LISTENER")
lnRetVal = Oxfrx.SetParams("test.pdf",,,,,,"PDF",,,,.T.)
IF lnRetVal = 0
    REPORT FORM test object oxfrx
ENDIF

Digital signatures in PDF

The digital signature can be used to validate the document content and the identity of the signer. (You can find more at http://en.wikipedia.org/wiki/Digital_signature). XFRX implements the "MDP (modification detection and prevention) signature" based on the PDF specification version 1.7, published in November 2006.

The signing algorithm in XFRX computes the encrypted document digest and places it, together with the user certificate, into the PDF document. When the PDF document is opened, the Adobe Acrobat (Reader) validates the digest to make sure the document has not been changed since it was signed. It also checks to see if the certificate is a trusted one and complains if it is not. The signature dictionary inside PDF can also contain additional information and user rights - see below.

At this moment XFRX supports invisible signatures only (Acrobat will show the signature information, but there is no visual element on the document itself linking to the digital signature). We will support visible signatures in future versions.

In the current version, XFRX is using the CMS/PKCS #7 detached messages signature algorithm in the .net framework to calculate the digest - which means the .NET framework 2.0 or newer is required. The actual process is run via an external exe - "xfrx.sign.net.exe", that is executed during the report conversion process. In future, we can alternatively use the OpenSSL library instead.

How to invoke the digital signing

The syntax is the same for VFP 9.0 and pre-VFP 9.0 calling methods

To generate a signed PDF document, call the DigitalSignature method before calling SetParams. The DigitalSignature method has 7 parameter:

cSignatureFile

The .pfx file. pfx, the "Personal Information Exchange File". This file contains the public certificate and (password protected) private key. You get this file from a certificate authority or you can generate your own for testing, which for example, OpenSSL (http://www.slproweb.com/products/Win32OpenSSL.html). XFRX comes with a sample pfx that you can use for testing.

cPassword

The password protecting the private key stored in the .pfx file

nAccessPermissions

per PDF specification: 
1 - No changes to the document are permitted; any change to the document invalidates the signature. 
2 - Permitted changes are filling in forms, instantiating page templates, and signing; other changes invalidate the signature. (this is the default value) 
3 - Permitted changes are the same as for 2, as well as annotation creation, deletion and modification; other changes invalidate the signature.

cSignatureName

per PDF specification: The name of the person or authority signing the document. This value should be used only when it is not possible to extract the name from the signature; for example, from the certificate of the signer.

cSignatureContactInfo

per PDF specification: Information provided by the signer to enable a recipient to contact the signer to verify the signature; for example, a phone number.

cSignatureLocation

per PDF specification: The CPU host name or physical location of the signing.

cSignatureReason

per PDF specification: The reason for the signing, such as ( I agree ... ).

Demo

The demo application that is bundled with the package (demo.scx/demo9.scx) contains a testing self-signed certificate file (TestEqeus.pfx) and a sample that creates a signed PDF using the pfx. Please note Acrobat will confirm the file has not changed since it was signed, but it will complaing the certificate is not trusted - you would either need to add the certificate as a trusted one or you would need to use a real certificate from a certification authority (such as VeriSign).

PDF/A support

PDF/A is an ISO standard for the digital preservation of electronic documents. PDF/A document is a PDF document with specific restrictions that ensure that the document will always display and print exactly the same way, no matter which platform or document viewer is used:

  • Platform independent
  • No hidden or transparent content
  • All information needed to display the document is embedded (including fonts)
  • Document metadata stored as XML
  • No encryption, no password protection
  • No javascript or other executable parts
  • No LZW compression
  • Displayed and printed content must match (all annotations must be printed)

There are currently two PDF/A specifications:

  • PDF/A-1 from 2005
  • PDF/A-2 from 2011

XFRX currently supports specification PDF/A-1 Level “B” (PDF/A-1b).

Please note the PDF/A-enabled document files can be significantly larger than regular PDF documents because the used fonts must always be included.

Invoking PDF/A

To generate a PDF/A document, call SetPDFA(.T.) method on the session object before processing. This method is available in VFP8 and VFP9 session objects, as well as the XFRX#DRAW object.

Example:

LOCAL loObj
loObj = EVALUATE([XFRX("XFRX#LISTENER")])
loObj.setpdfa(.T.)
lnRetVal = loObj.SetParams("pdfa9.pdf",,,1250,,,"PDF")
IF lnRetVal = 0
   REPORT FORM demoreps\invoices object loObj          
ENDIF

 

Barcode support (#UR SYMBOLFONT)

(Obsolete since XFRX 15.7)
Put "#UR SYMBOLFONT" into the comment of the report field that contains the barcode. This will instruct the engine not to do any codepage conversions and flag the font as a symbol font in the PDF document.

Parameter UNICODE support

You can set UNICODE output for document.

loSession.SetOtherParams("UNICODE",.T.) 

 Parameter DONOTPUTDOCUMENTID  

On french OS you can have problem with searching in Adobe Reader. In this case you can set parameter DONOPUTDOCUMENTID, if you do not use passwords or digital signature.

 loSession.SetOtherParams("DONOTPUTDOCUMENTID,.T.) 

 Debug mode 

 Parameters DEVELOP and DEVELOPFOLDER

If you set these parameters, xfrx copy temporary files into specified folder. 

   loSession.setOtherParams("DEVELOP",.T.)
   loSession.setOtherParams("DEVELOPFOLDER",lcPath+"_out\"+lcOut)

 Parameter  DONOTZIPTEXTSTREAM

If you set the parameter, output stream inside PDF will not be compressed.  

 loSession.SetOtherParams("DONOTZIPTEXTSTREAM",.T.)

 

 

  • No labels