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

发布于 2024-11-30 00:43:10 字数 190 浏览 1 评论 0 原文

我正在使用 PHP 和 FPDF 生成 PDF。这效果很好。

现在我想要的是:
在多页 PDF 中,所有页面都必须使用纸盘 1 中的纸张打印最后一页,并使用纸盘 2 中的最后一页进行打印。

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

I am generating a PDF by PHP with FPDF. This works well.

Now what I want:
From a multipage PDF all pages expect the last one have to print with paper from tray1 and the last page from tray2.

Now the Question:
How is this possible? Is this a Acrobat Reader issue? Can it be done with JavaScript in PDF?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

む无字情书 2024-12-07 00:43:10

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

It is not possible, as PDFs do not contain any information on the printer trays or other information. It is actually set in the printer instructions through the client's printer driver, who has to provide this information to the client program. If you need this functionality for batch processing, you'd have to leave PHP and get on the client side, e.g. through the Acrobat SDK, in which you can give this information, e.g. on a PostScript printer via the SetPageDevice-function

邮友 2024-12-07 00:43:10

我在 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。您可能需要使用媒体选项才能使其满足您的需要。 “上部”是您要定位的托盘。

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

I use CUPS on an intranet website. I don't specify a tray and my code is ruby, but the principle definitely works.

Here's my code, see if you can adapt it for your scenario

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

The basic idea is to generate the PDF, save it to disk then call this method to shell out to CUPS. You might need to play with the media option to get it doing what you need. 'Upper' is the tray you're targeting.

Make sure path is sanitised before being passed to this method or you risk opening a security hole.

拍不死你 2024-12-07 00:43:10

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

PHP can send some things to a print server like CUPS, but it can't get something to print on a client's machine save through JavaScript. JavaScript does not have the ability to control the individual's printer settings when being called from a browser. And while there are bindings for embedded PDF's in JS, there is no guarantee that the user will not simply have the file open in a standalone PDF reader (my computer at home is configured this way).

孤寂小茶 2024-12-07 00:43:10

对于这篇文章的未来读者,如果商业图书馆是一个有效的选择,那么可以使用 Amyuni PDF Creator ActiveX(Delphi、C++、VB、PHP)或使用 Amyuni PDF Creator .Net(C#、VB.net 等),通过更改 页面对象

此属性的可能值可以在 MSDN 中的 DEVMODE 结构文档,示例: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 工作。

For future readers of this post, if a commercial library is a valid choice then it is possible to do this with Amyuni PDF Creator ActiveX (Delphi, C++, VB, PHP) or with Amyuni PDF Creator .Net (C#, VB.net, etc.) by changing the "PaperBin" property of a page object.

Possible values for this property can be found in the documentation for the DEVMODE structure in MSDN, examples: DMBIN_UPPER - 0x0001, DMBIN_LOWER - 0x0002, DMBIN_AUTO - 0x0007.

The code in C# would look like this:

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); 

For PHP, you will need to use the ActiveX version, and create the document using the ProgID of the ActiveX control:

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

Note that this approach is about printing to a specific tray using the library, as other answers have mentioned, it is not possible to store this information in the PDF file itself so that it can be used by other applications.

Disclaimer: I currently work for Amyuni Technologies.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文