1

可能重复:
如何将 pdf 页面设置设置为打印属性对话框?

我正在使用 SSRS 或使用 HTML 到 PDF 组件生成许多 PDF。我想要为每个文档做的是将要打印的第一页设置到纸盘 1 和后续页面。

有没有办法做到这一点?System.Drawing.Printing 和 System.Printing 似乎是不错的候选者,但它们似乎对 PDF 没有用(我可能错了)。Adobe sdk 乍一看似乎也没有那种粒度级别。

4

3 回答 3

2

您是否尝试在要打印的机器上的打印选项中创建配置文件?您可以为第 1 页和后续页面指定不同的纸张来源。在我看来,这正是您正在寻找的。

于 2012-11-07T13:45:06.857 回答
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 格式,然后在打印之前为每页指定托盘,但据我所知,这是最后部分是特定于设备的(我可能错了)。

于 2012-11-07T14:39:15.650 回答
0

这在 PDF 中无法解决,因为 PDF 与硬件无关。

JDF就是为此而开发的,但只有印刷厂才能处理。

于 2012-11-07T09:40:34.803 回答