以编程方式打印 PDF 会使文件大小膨胀

Printing PDF programmatically bloats file size

好的,所以我接到了一项任务,要构建一个轻量级的打印功能,该功能将取代花费大量金钱的第三方工具,不仅如此,功能太多了。

我已经成功地构建了一个小系统来轮询一些数据并调用本地 MVC 应用程序上的端点,然后打印文档。

一切都很好,但我真的很难弄清楚为什么在打印队列时 PDF 文件大小会膨胀。

当前文件大小为 822KB,当我通过 Adob​​e 手动打印时,PDF 被压缩为 342KB

但使用系统时它膨胀到惊人的 4.22MB

请注意,我正在使用 PDFium SDK Nuget package 来减轻一些繁重的工作。话虽如此,我确实利用 System.Drawing.Printing 来制作设置以传递给 PDFium

演示打印的小代码:

        public bool PrintPDF(string printer, 
            string filePath)
        {
            try
            {
                var printerSettings = new PrinterSettings
                {
                    PrinterName = "Hewlett-Packard HP LaserJet P2015 Series",
                    Copies = 1,
                };

                using (var document = PdfDocument.Load(@"C:\folder\Documentation\test.pdf"))
                {
                    using (var printDocument = document.CreatePrintDocument())
                    { 
                        printDocument.PrinterSettings = printerSettings;
                        printDocument.DefaultPageSettings = pageSettings;
                        printDocument.DocumentName = "test.pdf";
                        printDocument.PrintController = new StandardPrintController();
                        printDocument.Print();
                    }
                }
                return true;
            }
            catch(System.Exception ex)
            {
                new Email().SendEmail("", "TEST ERR", ex.Message, "email address");
                return false;
            }
        }

目前,如果它打印物理尺寸 (822KB) 而不是膨胀它,我会很高兴。

我非常感谢一些正确方向的指导和推动。

PDF(通常)是页面的矢量表示,它是页面 描述。 PDF 也可以包含位图数据,但对于文本和艺术线条,它通常是矢量,而白色 space 根本不包含在描述中。

当您打印时,应用程序会在后台创建与您的打印机兼容的设备上下文 select,重播它用于在显示器上绘制内容的绘图命令,然后告知打印机上下文打印。

这会导致设备驱动程序收到 GDI 命令以绘制页面。根据打印机类型(即它理解的页面描述语言),设备驱动程序可以简单地传递命令(对于 GDI 打印机),将它们转换为高级矢量表示(如 PostScript)或将它们呈现为位图。一些驱动程序可能会结合使用这些方法。然后将结果发送到打印机。

A​​dobe PDF 'printer' 通过增选 Windows PostScript 打印机驱动程序工作,该驱动程序将 GDI 命令转换为向量 PostScript 操作,这些操作很容易转换为向量 PDF 操作,从而导致一个小的页面的表示。

在我看来您的打印机(或可能是打印机驱动程序)是 'dumb' 并且想要或正在发送大位图。曾几何时,在串行接口上​​的打印机 运行 和 9600 波特速度很快的时代,保持文件大小小并让打印机智能化是值得的,因为发送数据需要很长时间。如今,这已经不是什么大问题了,即使是几兆字节也无法快速传输,如果您将预渲染的位图发送到打印机,打印机可能会变得笨拙 still 快速打印,因为它所要做的就是 t运行sfer 位。

你在 "print manually using Adobe" 或 "use the system" 时并没有真正表达你的意思,所以我不能告诉你更多,但我猜你的大 PDF 只包含一个大(压缩)图像。