[Lazarus] PDF generator

Michael Van Canneyt michael at freepascal.org
Sat Mar 5 18:27:24 CET 2016


Hi,

I have committed a PDF generator to FPC Subversion: fcl-pdf.

Why a new pascal PDF generator ? 
Mainly because the existing ones written in Object Pascal suffer from
several disadvantages: 
- Font support usually incomplete or downright buggy.
- Dependency on a GUI (LCL, VCL, Windows).
The latter is important because the PDFs must be generated on a headless (no
display) webserver.

So, the fcl-pdf package contains a PDF generating unit fppdf that does not depend
on any external libraries or GUI system.

The PDF generator has the following features:
- Support for basic shapes.
- Support for basic line styles.
- Dictionary support.
- Multi-page PDF.
- Image support.
- TTF Font support.
- Font embedding.
- Unicode font support.
- Stream Compression.
- Image embedding.
- Several paper types.
- Portrait/Landscape.
- Support for multiple measurement units.
- Rotation matrix system.
- PDF creator information.
- The generated PDF passes several PDF validators.

The library is based on a library that came with FPGUI, with a feature set
which came closest to what I desired. It was completed for the company I
work for by Graeme Geldenhuys, and is heavily unit tested.

It is not yet feature-complete, but the above should be ample for most
applications.

In the near future, I expect to commit a reporting engine which, likewise, 
does not need a GUI (but can use one) and uses the PDF generator as one 
possible backend.

Todo:
- Implement TFPCustomCanvas descendent (TPDFCanvas) that draws on a PDF.
   (should allow easy integration in LCL) 
- Partial embedding of (unicode) fonts (only used glyphs) for smaller PDFs.
- On windows (possibly mac), allow to use native font mechanisms for extracting info from TTF files.
- Reduce memory usage by streaming finished pages to file.

Optionally:
- PDF Forms ?
- Archive format ?
- Signatures ?

Enjoy,

I would welcome additional tests/demos, suggestions, bugreports, improvements or patches.

Michael.




More information about the Lazarus mailing list