控制pdf的打印选项

时间:2012-11-06 16:58:04

标签: .net pdf printing

  

可能重复:
  how to set pdf page settings to print properties dialog?

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

据我所知,您无法在PDF文件本身中指定此类信息。 您可以从打印应用程序中选择一些选项:

选项1 :使用P / Invoke和商业库Amyuni PDF Creator ActiveX (通常的免责声明适用)

对于使用自定义配置的静默打印,您可以尝试使用Win32 API。您需要创建一个DEVMODE结构,并在打印过程中使用它。

MSDN中的这篇文章可能有所帮助:
How To Modify Printer Settings with the DocumentProperties() Function

在Amyuni PDF Creator ActiveX中,您可以在调用Document.Print方法之前为文档对象设置DEVMODE结构。

byte[] devmode = GetMyDevModeAsByteArray();
pdfCreator1.Document.AttributeByName(”PrinterDevMode”).Value = devmode;

我必须说我没有测试过这个。 “PrinterDevMode”属性上使用的DEVMODE结构是由ActiveX控件本身通过显示打印设置对话框生成的,但我认为可以安全地假设它可以通过其他方式获得,因为最终在所有情况下定义结构的是打印机驱动程序。 如果我有时间,我可以稍后测试一下。

Amyuni PDF Creator还可以根据PDF文件中为每个页面指定的页面大小选择纸盘。因此,如果这是您实际尝试实现的目标,则可以使用"FormToBinMap" document attribute配置要用于每个页面大小的托盘。在这种情况下,您无需自定义DEVMODE结构。

选项2:使用WPF:

如果您使用WPF,并且目标打印机提供XPS驱动程序,那么您可以使用PrintTicket.InputBin

执行此操作

来自MSDN:

PrintTicket.InputBin 属性:

  

获取或设置一个值,指示要使用的输入框(纸盘)。

您可以使用Amyuni PDF Creator .Net或ActiveX将您的PDF文件转换为XPS 或者,如果GPL许可证符合您的需求,您可以使用ghostscript将文件转换为光栅图像,然后wrap that in XPS files

选项3:

如果您的目标打印机是PostScript打印机,您可以将文件拆分为1页文件,然后使用ghostscript将每个文件转换为PostScript格式,然后在打印前为每个页面指定托盘,但就我而言知道这最后一部分是特定于设备的(我可能错了)。

答案 2 :(得分:0)

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

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