Blog
All Blog Posts | Next Post | Previous Post
Generating PDF files cross-platform with ease
Thursday, December 22, 2016
With the new 1.7 release of the TMS FNC UI Pack we've added a completely new PDF library built from the ground up, that is capable of generating PDF files on all supported frameworks (FMX, VCL, LCL). Via all supported frameworks, you can easily target minimum 5 different operating systems: Windows, macOS, iOS, Android, Linux (&Raspbian),.. To introduce this new PDF library I've written a small tutorial to start generating your own PDF files. Getting Started To get started with the PDF library, add the FMX.TMSFNCPDFLib, VCL.TMSFNCPDFLib or LCLTMSFNCPDFLib depending on the chosen framework. The PDF library class is called TTMSFNCPDFLib, and the code is shareable between the three supported frameworks. Starting a new document Starting a new document can be file-based, or TMemoryStream-based. To start a new document, call the BeginDocument function. The BeginDocument always needs to be paired with EndDocument, which is responsible for writing the contents to a file or TMemoryStream. When the AFileName parameter in the BeginDocument call is empty, the contents will be written to a TMemoryStream, returned by the EndDocument call. The EndDocument call also has an additional parameter to allow opening the generated PDF file in the default PDF reader application.procedure TForm1.GeneratePDF(AFileName: string);
var
p: TTMSFNCPDFLib;
begin
p := TTMSFNCPDFLib.Create;
try
p.BeginDocument(AFileName);
p.EndDocument;
finally
p.Free;
end;
end;procedure TForm1.GeneratePDF(AFileName: string);
var
p: TTMSFNCPDFLib;
begin
p := TTMSFNCPDFLib.Create;
try
p.BeginDocument(AFileName);
p.NewPage;
p.EndDocument;
finally
p.Free;
end;
end;procedure TForm1.GeneratePDF(AFileName: string);
var
p: TTMSFNCPDFLib;
begin
p := TTMSFNCPDFLib.Create;
try
p.BeginDocument(AFileName);
p.NewPage;
p.Graphics.Stroke.Color := gcRed;
p.Graphics.Stroke.Width := 3;
p.Graphics.Stroke.Kind := gskDashDotDot;
p.Graphics.Fill.Kind := gfkGradient;
p.Graphics.Fill.Color := gcBlue;
p.Graphics.Fill.ColorTo := gcOrange;
p.Graphics.DrawRectangle(RectF(10, 50, 100, 150));
p.EndDocument(True);
finally
p.Free;
end;
end;
Drawing Text
Drawing text on a PDF page is done via the DrawText function. The DrawText has a set of parameters to allow drawing wordwrapped text in a rectangle, or simply as-is at a specific position. The DrawText function has a set of overloads that also supports column drawing. Each call to DrawText returns a value that can either contain the calculated text rectangle or the amount of left-over characters after an overflow is detected when drawing text in a column.
The font that is used when drawing text can be controlled separately via the Font property. With this property, the font name, size, color and style can be set.
procedure TForm1.GeneratePDF(AFileName: string);
var
p: TTMSFNCPDFLib;
begin
p := TTMSFNCPDFLib.Create;
try
p.BeginDocument(AFileName);
p.NewPage;
p.Graphics.Font.Name := 'Segoe UI';
p.Graphics.Font.Size := 16;
p.Graphics.Font.Color := gcRed;
p.Graphics.Font.Style := [TFontStyle.fsBold];
p.Graphics.DrawText('Hello World !', PointF(10, 50));
p.EndDocument(True);
finally
p.Free;
end;
end;
HTML formatted text
HTML formatted text is also supported by using the DrawHTMLText call. When passing a TMSFNCBitmapContainer reference it can even draw images referenced by the <IMG> tag. HTML support is based on the miniHTML reference.
procedure TForm1.GeneratePDF(AFileName: string);
var
p: TTMSFNCPDFLib;
s: string;
r: TRectF;
begin
p := TTMSFNCPDFLib.Create;
try
s := 'Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry''s standard dummy'+
'text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. '+
'It has survived not only five centuries, but also the leap into electronic typeset'+
'ting,
remaining essentially unchanged. It'+
' was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with des'+
'ktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.';
p.BitmapContainer := TMSFNCBitmapContainer1;
p.BeginDocument(AFileName);
p.NewPage;
p.Graphics.Font.Name := 'Arial';
p.Graphics.Font.Size := 10;
p.Graphics.Fill.Color := gcNull;
r := RectF(10, 50, 300, 400);
p.Graphics.DrawHTMLText(s, r);
p.EndDocument(True);
finally
p.Free;
end;
end;
The PDF library supports more than simple text and graphics. More information on the PDF library and the features can be found at the following page
https://www.tmssoftware.com/site/tmsfncuipack.asp?s=fncpdf#features.
The PDF library is also available in the TMS FMX UI Pack and is coming to the TMS Component Pack at the beginning of 2017!Pieter Scheldeman
This blog post has received 6 comments.
2. Monday, January 20, 2020 at 7:52:33 PM
What *exact* problem do you experience?
Bruno Fierens
3. Tuesday, March 30, 2021 at 4:12:57 PM
Hello, Does someone know with an ttmsFNCGrid, how to export his content into a pdf and give it information as pagenumber (for example 1/20) on each page and alsofixed colums on each page.
I tried to use TTMSFNCGridPDFIO and give it my grid, but the options pdf.Options.RepeatFixedColumns doesn''t work
Thanks
lagire
4. Tuesday, March 30, 2021 at 6:17:59 PM
You can set the page number with TTMSFNCGridPDFIO.Options.PageNumber and the format with TTMSFNCGridPDFIO.Options.PageNumberFormat.It is at this moment not possible to display the total page count in the page number as this is not precalculated for performance reasons.
Bruno Fierens
5. Saturday, December 25, 2021 at 12:16:03 PM
Can TTMSFNCPDFLib export pdf page as bitmap ?
Bilal Al-Hamad
6. Sunday, June 12, 2022 at 6:42:47 AM
Hi,Can this be used to convert a WORD containing fill forms (doc/docx) to PDF?
Stef Merlijn
All Blog Posts | Next Post | Previous Post
Mark Richards