Печать многостраничного PDF-файла на разных лотках принтера

Я создаю PDF-файл PHP с помощью FPDF. Это хорошо работает.

Теперь, что я хочу:
Из многостраничного PDF-страниц все страницы ожидают, что последним придется печатать с бумагой из лотка 1 и последней страницы из лотка2.

Теперь вопрос:
Как это возможно? Это проблема Acrobat Reader? Можно ли это сделать с помощью JavaScript в формате PDF?

Это невозможно, так как PDF-файлы не содержат информации о лотках принтера или другой информации. Он фактически задан в инструкциях принтера через драйвер принтера клиента, который должен предоставить эту информацию клиентской программе. Если вам нужна эта функциональность для пакетной обработки, вам придется оставить PHP и перейти на клиентскую сторону, например, через Acrobat SDK, в котором вы можете предоставить эту информацию, например, на PostScript-принтере через функцию SetPageDevice

Я использую 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. Возможно, вам придется играть со средством массовой информации, чтобы заставить его делать то, что вам нужно. «Верхний» – это лоток, на который вы нацеливаетесь.

Перед тем, как перейти к этому методу, убедитесь, что путь очищен, или вы рискуете открыть отверстие для безопасности.

PHP может отправлять некоторые вещи на сервер печати, такой как CUPS, но он не может заставить что-то печатать на машине клиента, за исключением JavaScript. JavaScript не имеет возможности управлять настройками принтера пользователя при вызове из браузера. И хотя есть привязки для встроенных PDF-файлов в JS, нет гарантии, что пользователь не будет просто открывать файл в автономном PDF-ридере (мой компьютер дома настроен таким образом).

Для будущих читателей этого сообщения, если коммерческая библиотека является допустимым выбором, это можно сделать с помощью Amyuni PDF Creator ActiveX (Delphi, C ++, VB, PHP) или с Amyuni PDF Creator .Net (C #, VB.net, и т. д.), изменив свойство «PaperBin» объекта страницы .

Возможные значения этого свойства можно найти в документации для структуры DEVMODE в 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 и создать документ с помощью ProgID элемента управления ActiveX:

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

Обратите внимание, что этот подход касается печати на конкретном лотке с использованием библиотеки, как упоминалось в других ответах, невозможно сохранить эту информацию в самом файле PDF, чтобы она могла использоваться другими приложениями.

Отказ от ответственности: В настоящее время я работаю в Amyuni Technologies.