可能重复:
如何将 pdf 页面设置设置为打印属性对话框?
我正在使用 SSRS 或使用 HTML 到 PDF 组件生成许多 PDF。我想要为每个文档做的是将要打印的第一页设置到纸盘 1 和后续页面。
有没有办法做到这一点?System.Drawing.Printing 和 System.Printing 似乎是不错的候选者,但它们似乎对 PDF 没有用(我可能错了)。Adobe sdk 乍一看似乎也没有那种粒度级别。
可能重复:
如何将 pdf 页面设置设置为打印属性对话框?
我正在使用 SSRS 或使用 HTML 到 PDF 组件生成许多 PDF。我想要为每个文档做的是将要打印的第一页设置到纸盘 1 和后续页面。
有没有办法做到这一点?System.Drawing.Printing 和 System.Printing 似乎是不错的候选者,但它们似乎对 PDF 没有用(我可能错了)。Adobe sdk 乍一看似乎也没有那种粒度级别。
您是否尝试在要打印的机器上的打印选项中创建配置文件?您可以为第 1 页和后续页面指定不同的纸张来源。在我看来,这正是您正在寻找的。
据我所知,您无法在 PDF 文件本身中指定此类信息。您确实可以从打印应用程序中获得一些选项:
选项 1:使用 P/Invoke 和商业图书馆Amyuni PDF Creator ActiveX (通常的免责声明适用):
对于使用自定义配置的静默打印,您可以尝试使用 Win32 API。您需要创建一个 DEVMODE 结构,并在打印期间使用它。
MSDN 中的这篇文章可能会有所帮助:
如何使用 DocumentProperties() 函数修改打印机设置
在 Amyuni PDF Creator ActiveX 中,您可以在调用Document.Print方法之前为文档对象设置一个 DEVMODE 结构。
byte[] devmode = GetMyDevModeAsByteArray();
pdfCreator1.Document.AttributeByName(”PrinterDevMode”).Value = devmode;
我必须说我没有测试过这个。“PrinterDevMode”属性上使用的 DEVMODE 结构是由 ActiveX 控件本身通过显示打印设置对话框生成的,但我认为可以安全地假设它可以通过其他方式获得,因为在所有情况下,最终定义结构的是打印机驱动程序。如果我有时间,我可以稍后测试。
Amyuni PDF Creator 还可以根据为 PDF 文件中的每个页面指定的页面大小选择纸盘。因此,如果这是您真正想要实现的目标,您可以使用“FormToBinMap”文档属性来配置您要为每个页面大小使用的托盘。在这种情况下,您不需要自定义 DEVMODE 结构。
选项 2:使用 WPF:
如果您使用 WPF,并且如果目标打印机提供 XPS 驱动程序,那么您可以使用PrintTicket.InputBin执行此操作
来自 MSDN:
PrintTicket.InputBin属性:
获取或设置一个值,该值指示要使用的输入纸盒(纸盘)。
您可以使用 Amyuni PDF Creator .Net 或 ActiveX 将您的 PDF 文件转换为 XPS。
或者,如果 GPL 许可证适合您的需要,您可以使用 ghostscript 将文件转换为光栅图像,然后将其包装在 XPS 文件中。
选项 3:
如果您的目标打印机是 PostScript 打印机,您可以将文件拆分为 1 页文件,然后使用 ghostscript 将每个文件转换为 PostScript 格式,然后在打印之前为每页指定托盘,但据我所知,这是最后部分是特定于设备的(我可能错了)。
这在 PDF 中无法解决,因为 PDF 与硬件无关。
JDF就是为此而开发的,但只有印刷厂才能处理。