以编程方式打印PDF文件大小

时间:2017-08-17 09:10:49

标签: c# pdf printing pdfium

好的,所以我已经完成了构建轻量级打印功能的任务,该功能将取代花费大量资金的第三方工具,而且不仅如此,还有太多功能。

我设法建立了一个小型系统来轮询一些数据并在内部部署的MVC应用程序上调用端点,然后该应用程序打印文档。

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

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

但是使用该系统它会膨胀到惊人的 4.22MB

enter image description here

注意我正在使用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)而不是膨胀它,我会感到高兴。

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

1 个答案:

答案 0 :(得分:1)

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

当您进行打印时,应用程序会在幕后创建与您选择的打印机兼容的设备上下文,重放用于在显示器上绘制内容的绘图命令,然后告诉打印机上下文进行打印。

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

Adob​​e PDF'打印机'通过选择Windows PostScript打印机驱动程序来工作,该驱动程序将GDI命令转换为矢量PostScript操作,这些操作很容易转换为矢量PDF操作,从而导致页面的小表示。

听起来像你的打印机(或可能是打印机驱动程序)是“愚蠢的”。并希望或正在发送一个大位图。曾几何时,在打印机在串行接口上​​运行并且9600波特率很快的时代,值得保持文件大小小并使打印机变得智能,因为它需要很长时间才能发送数据。如今,这不是一个问题,即使几兆字节也可以快速传输,如果您将预先渲染的位图发送到打印机,打印机可能会变得愚蠢,仍然打印速度快,因为它所要做的就是传输这些位。

当您使用Adobe"手动打印时,您还没有真正说出您的意思。或者"使用系统"所以我不能告诉你更多,但我的猜测是你的大PDF只包含一个大的(压缩的)图像。