在不同的打印机托盘上打印多页PDF

时间:2011-08-16 15:50:49

标签: php pdf printing fpdf tcpdf

我正在使用FPDF通过PHP生成PDF。这很好用。

现在我想要什么:
从多页PDF中,所有页面都需要使用tray1中的纸张和tray2中的最后一页打印最后一页。

现在问题:
这怎么可能?这是Acrobat Reader问题吗?可以用PDF格式的JavaScript完成吗?

4 个答案:

答案 0 :(得分:5)

不可能,因为PDF不包含有关打印机托盘或其他信息的任何信息。它实际上是通过客户端的打印机驱动程序在打印机指令中设置的,该驱动程序必须将此信息提供给客户端程序。如果您需要此功能进行批处理,则必须离开PHP并进入客户端,例如通过Acrobat SDK,您可以在其中提供此信息,例如通过SetPageDevice-function

在PostScript打印机上

答案 1 :(得分:3)

我在Intranet网站上使用CUPS。我没有指定托盘,我的代码是红宝石,但原则肯定有效。

这是我的代码,看看你是否可以根据你的场景进行调整

def print(path)
  raise ArgumentError, "'#{path}' does not exist" unless File.file?(path)

  `lp -s -d printer_name -h 127.0.0.1 -o page-ranges=1-4 -o media=A4,Upper #{path}`

  $?.to_i == 0 ? true : false
end

基本思想是生成PDF,将其保存到磁盘然后调用此方法以外壳到CUPS。您可能需要使用媒体选项来使其满足您的需要。 “上方”是您要定位的托盘。

确保在传递给此方法之前清理路径,否则可能会打开安全漏洞。

答案 2 :(得分:1)

PHP可以将一些东西发送到像CUPS这样的打印服务器,但是除了通过JavaScript之外,它无法在客户端的机器上打印。从浏览器调用时,JavaScript无法控制个人的打印机设置。虽然JS中有嵌入式PDF的绑定,但无法保证用户不会在独立的PDF阅读器中打开文件(我的家中的计算机就是这样配置的)。

答案 3 :(得分:1)

对于本文的未来读者,如果商业库是有效的选择,则可以使用Amyuni PDF Creator ActiveX(Delphi,C ++,VB,PHP)或Amyuni PDF Creator .Net(C#, VB.net等)通过更改page object的“PaperBin”属性。

此属性的可能值可在documentation for the DEVMODE structure in MSDN中找到,例如:DMBIN_UPPER - 0x0001,DMBIN_LOWER - 0x0002,DMBIN_AUTO - 0x0007。

C#中的代码如下所示:

Amyuni.PDFCreator.IacDocument pdfDoc = new Amyuni.PDFCreator.IacDocument();
using(FileStream fs = File.Open("MyDocument.pdf", FileMode.Open))
{
    pdfDoc.Open(fs, "");
}

const int DMBIN_MANUAL = 4;
for( int pageNumber = 1; i <= pdfDoc.PageCount; i++)
{
    pdfDoc.GetPage(pageNumber).AttributeByName("PaperBin").Value = DMBIN_MANUAL;
}

pdfDoc.Print("My Laser Printer", False); 

对于PHP,您需要使用ActiveX版本,并使用ActiveX控件的ProgID创建文档:

$pdfdoc = new COM("PDFCreactiveX.PDFCreactiveX");

请注意,此方法是使用库打印到特定托盘,正如其他答案所提到的,无法将此信息存储在PDF文件本身中,以便其他应用程序可以使用它。

免责声明:我目前在Amyuni Technologies工作。