1

好的,所以我的任务是构建一个轻量级的打印功能,它将取代花费大量资金的第三方工具,不仅如此,它还有太多的功能。

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

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

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

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

在此处输入图像描述

需要注意的是,我正在使用PDFium SDK Nuget 包来减轻一些繁重的工作。话虽如此,我确实利用 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)而不是膨胀它,我会很高兴。

我真的很感谢一些指导和朝着正确方向轻推。

4

1 回答 1

2

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

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

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

Adobe PDF“打印机”通过选择 Windows PostScript 打印机驱动程序来工作,该驱动程序将 GDI 命令转换为矢量 PostScript 操作,这些操作很容易转换为矢量 PDF 操作,从而产生较小的页面表示。

在我看来,您的打印机(或可能的打印机驱动程序)“愚蠢”并且想要或正在发送一个大位图。曾几何时,在打印机在串行接口上​​运行且 9600 波特率很快的日子里,保持文件大小较小并让打印机智能是值得的,因为发送数据需要很长时间。如今,这已经不是什么大问题了,甚至几兆字节都可以快速传输,如果您将预渲染位图发送到打印机,打印机可以是哑巴并且仍然可以快速打印,因为它所要做的就是传输位。

当您“使用 Adob​​e 手动打印”或“使用系统”时,您并没有真正说出您的意思,所以我不能告诉您更多信息,但我的猜测是您的大 PDF 只包含一个大的(压缩的)图片。

于 2017-08-17T12:38:00.693 回答