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

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

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

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


person scube    schedule 16.08.2011    source источник
comment
возможный дубликат переключение лотков принтера   -  person Marc B    schedule 16.08.2011
comment
@Marc - Как это может быть дубликатом вопроса Python?   -  person Álvaro González    schedule 16.08.2011
comment
потому что PDF-файлы не поддерживают спецификации лотков для принтеров, что было бы верно на ЛЮБОМ языке.   -  person Marc B    schedule 16.08.2011


Ответы (4)


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

person Lars    schedule 19.08.2011

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

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

person James Healy    schedule 21.08.2011

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

person cwallenpoole    schedule 16.08.2011
comment
Мне это нужно для нашей внутренней администрации. так что у меня есть полный контроль над настройками рабочей станции и сервером, на котором работает генерация PDF. Любые ресурсы по отправке PHP в CUPS? - person scube; 16.08.2011

Для будущих читателей этого поста: если коммерческая библиотека является допустимым выбором, это можно сделать с помощью 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.

person yms    schedule 16.05.2013