【问题标题】:Print multipage PDF on different printer-trays在不同的打印机托盘上打印多页 PDF
【发布时间】:2011-10-28 04:57:30
【问题描述】:

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

现在我想要什么:
从多页 PDF 中,所有页面都希望最后一页必须使用托盘 1 中的纸张和托盘 2 中的最后一页打印。

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

【问题讨论】:

  • Switching Printer Trays 的可能重复项
  • @Marc - 这怎么可能是 Python 问题的重复?
  • 因为 PDF 不支持打印机托盘规格,这在任何语言中都是正确的。

标签: php pdf printing fpdf tcpdf


【解决方案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 工作。

【讨论】:

    【解决方案2】:

    我在 Intranet 网站上使用 CUPS。我没有指定托盘,我的代码是 ruby​​,但原理绝对有效。

    这是我的代码,看看你能不能适应你的场景

    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。您可能需要使用媒体选项来完成您需要的操作。 “上”是您要定位的托盘。

    确保在传递给此方法之前对路径进行了清理,否则您将面临打开安全漏洞的风险。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        PHP 可以将某些内容发送到 CUPS 之类的打印服务器,但它无法通过 JavaScript 在客户端机器上打印某些内容。当从浏览器调用 JavaScript 时,JavaScript 无法控制个人的打印机设置。虽然 JS 中有嵌入 PDF 的绑定,但不能保证用户不会简单地在独立的 PDF 阅读器中打开文件(我家的电脑就是这样配置的)。

        【讨论】:

        • 我需要它用于我们的内部管理。所以我可以完全控制工作站设置和运行 pdf 生成的服务器。任何关于 PHP 的资源发送到 CUPS?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多