好的,所以我已经完成了构建轻量级打印功能的任务,该功能将取代花费大量资金的第三方工具,而且不仅如此,还有太多功能。
我设法建立了一个小型系统来轮询一些数据并在内部部署的MVC应用程序上调用端点,然后该应用程序打印文档。
一切都很好,但我真的很难弄清楚为什么PDF文件大小在点击打印队列时会膨胀。
当我通过Adobe手动打印时,文件大小为 822KB ,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)而不是膨胀它,我会感到高兴。
我非常欣赏一些指导和正确方向的推动。
答案 0 :(得分:1)
PDF(通常)是页面的矢量表示,其页面为描述。 PDF也可以包含位图数据,但对于文本和艺术线条,它通常是矢量,而白色空间根本不包含在描述中。
当您进行打印时,应用程序会在幕后创建与您选择的打印机兼容的设备上下文,重放用于在显示器上绘制内容的绘图命令,然后告诉打印机上下文进行打印。
这会导致设备驱动程序传递GDI命令来绘制页面。根据打印机类型(即它理解的页面描述语言),设备驱动程序可以简单地传递命令(对于GDI打印机),将它们转换为高级矢量表示(如PostScript)或将它们渲染为位图。一些驾驶员可能会将这些方法结合起来。然后将结果发送到打印机。
Adobe PDF'打印机'通过选择Windows PostScript打印机驱动程序来工作,该驱动程序将GDI命令转换为矢量PostScript操作,这些操作很容易转换为矢量PDF操作,从而导致页面的小表示。
听起来像你的打印机(或可能是打印机驱动程序)是“愚蠢的”。并希望或正在发送一个大位图。曾几何时,在打印机在串行接口上运行并且9600波特率很快的时代,值得保持文件大小小并使打印机变得智能,因为它需要很长时间才能发送数据。如今,这不是一个问题,即使几兆字节也可以快速传输,如果您将预先渲染的位图发送到打印机,打印机可能会变得愚蠢,仍然打印速度快,因为它所要做的就是传输这些位。
当您使用Adobe"手动打印时,您还没有真正说出您的意思。或者"使用系统"所以我不能告诉你更多,但我的猜测是你的大PDF只包含一个大的(压缩的)图像。