PDF Generation, Bloat and Optimization

The State of myCFML PDF Generation My current comparison is with CFDocument on the deprecated CF2016 Developer Edition. I'm planning on performing tests with CF2021 & CF2023 soon and will perform this on my personal developer workstation using CommandBox and a testing framework that I'm in the process of developing. I have not personally downloaded or used CF2025 yet1. I believe that it may be using the same iText library as CF10. (Can anyone confirm this?) I also haven't compared with Lucee 5.3+ Flying Saucer implementation. This will be a part of a series as I intend on performing a lot more tests as well as sharing tips that we've learned on how to improve overall PDF quality, performance and file size. Technologies CFDocument Built-in Adobe ColdFusion function that creates PDF output from a text block containing CFML and HTML. (NOTE: Some ACF overhead may occur due to adding the "Adobe ColdFusion Developer/Trial Edition - Not for Production Use" watermark.) CFHTMLtoPDF Built-in Adobe ColdFusion function that creates PDFs from HTML using a WebKit based rendering engine. Some ACF overhead may occur due to adding the "Adobe ColdFusion Developer/Trial Edition - Not for Production Use" watermark. I tried testing this on a CF2016 Standard production server, but got the error message "No Service manager is available.". (We don't use CFHTMLTOPDF, so it may be disabled at the CFAdmin level.) WKHTMLTOPDF (LGPLv3; portable) tends to be faster and generate smaller PDFs. It can also run concurrently and generate PDFs in the background without using a ColdFusion thread or impacting the Java heap memory. Download Ghostscript (GNU GPL Affero license; portable) is an interpreter for the PostScript(R) language and PDF files. It runs on various embedded operating systems and platforms including Windows, macOS, the wide variety of Unix and Unix-like platforms, and VMS systems. Download Test an empty page with only a "Hello World" H1 header There's a huge differences in the generation file size and the Ghostscript optimization doesn't make much of a difference. Server Engine Generation FileSize Ghostscript Duration Ghostscript Filesize Percent Smaller CF2016 CFDocument 486 ms 40,837 10 ms 40,068 1.89% CF2016 CFHTMLTOPDF 1286 ms 77,179 9 ms 98,953 -28.20% CF2016 WKHTMLTOPDF 223 ms 7,539 9 ms 5,167 31.47% Hello World Tests with a locally-downloaded 4.7mb NASA JPG image rendered at 400px wide. The difference regarding file size is a much wider gap here for CFDocument. Using Ghostscript to optimize results in a much smaller CFDocument. Server Engine Generation FileSize Ghostscript Duration Ghostscript Filesize Percent Smaller CF2016 CFDocument 8,046 ms 24,311,787 50 ms 74,478 99.693% CF2016 CFHTMLTOPDF 2,256 ms 120,258 1017 ms 136,211 -11.71% CF2016 WKHTMLTOPDF 1,638 ms 492,115 45 ms 21,012 95.73% I also ran this test script on a production server for CFDocument to eliminate the watermark and the filesize was consistent 24mb, but the Ghostscript result was 47,028 (36.86% smaller if no watermark exists) and still twice as large as WKHTMLTOPDF. Hello World 1 I haven't personally interacted with CF2025 beyond accessing it online via CFFiddle. I haven't had any time to read the terms and do not wish to be legally bound by any rules that I may not be fully understand. Back to text Source Code https://gist.github.com/JamoCA/b957c34cddea38f4bd2d777b41e348ac

Apr 10, 2025 - 01:25
 0
PDF Generation, Bloat and Optimization

The State of myCFML PDF Generation

My current comparison is with CFDocument on the deprecated CF2016 Developer Edition. I'm planning on performing tests with CF2021 & CF2023 soon and will perform this on my personal developer workstation using CommandBox and a testing framework that I'm in the process of developing. I have not personally downloaded or used CF2025 yet1. I believe that it may be using the same iText library as CF10. (Can anyone confirm this?) I also haven't compared with Lucee 5.3+ Flying Saucer implementation.

This will be a part of a series as I intend on performing a lot more tests as well as sharing tips that we've learned on how to improve overall PDF quality, performance and file size.

Technologies

  • CFDocument Built-in Adobe ColdFusion function that creates PDF output from a text block containing CFML and HTML. (NOTE: Some ACF overhead may occur due to adding the "Adobe ColdFusion Developer/Trial Edition - Not for Production Use" watermark.)

  • CFHTMLtoPDF Built-in Adobe ColdFusion function that creates PDFs from HTML using a WebKit based rendering engine. Some ACF overhead may occur due to adding the "Adobe ColdFusion Developer/Trial Edition - Not for Production Use" watermark. I tried testing this on a CF2016 Standard production server, but got the error message "No Service manager is available.". (We don't use CFHTMLTOPDF, so it may be disabled at the CFAdmin level.)

  • WKHTMLTOPDF (LGPLv3; portable) tends to be faster and generate smaller PDFs. It can also run concurrently and generate PDFs in the background without using a ColdFusion thread or impacting the Java heap memory. Download

  • Ghostscript (GNU GPL Affero license; portable) is an interpreter for the PostScript(R) language and PDF files. It runs on various embedded operating systems and platforms including Windows, macOS, the wide variety of Unix and Unix-like platforms, and VMS systems. Download

Test an empty page with only a "Hello World" H1 header

There's a huge differences in the generation file size and the Ghostscript optimization doesn't make much of a difference.

Server Engine Generation FileSize Ghostscript Duration Ghostscript Filesize Percent Smaller
CF2016 CFDocument 486 ms 40,837 10 ms 40,068 1.89%
CF2016 CFHTMLTOPDF 1286 ms 77,179 9 ms 98,953 -28.20%
CF2016 WKHTMLTOPDF 223 ms 7,539 9 ms 5,167 31.47%

 lang="en">
 charset="utf-8">


Hello World

Tests with a locally-downloaded 4.7mb NASA JPG image rendered at 400px wide.

The difference regarding file size is a much wider gap here for CFDocument. Using Ghostscript to optimize results in a much smaller CFDocument.

Server Engine Generation FileSize Ghostscript Duration Ghostscript Filesize Percent Smaller
CF2016 CFDocument 8,046 ms 24,311,787 50 ms 74,478 99.693%
CF2016 CFHTMLTOPDF 2,256 ms 120,258 1017 ms 136,211 -11.71%
CF2016 WKHTMLTOPDF 1,638 ms 492,115 45 ms 21,012 95.73%

I also ran this test script on a production server for CFDocument to eliminate the watermark and the filesize was consistent 24mb, but the Ghostscript result was 47,028 (36.86% smaller if no watermark exists) and still twice as large as WKHTMLTOPDF.


 lang="en">
 charset="utf-8">


Hello World

src="/tempdirectory/images_yyyymmddHHnnss.jpg" width="400" height="248" border="1">

1 I haven't personally interacted with CF2025 beyond accessing it online via CFFiddle. I haven't had any time to read the terms and do not wish to be legally bound by any rules that I may not be fully understand. Back to text

Source Code

https://gist.github.com/JamoCA/b957c34cddea38f4bd2d777b41e348ac