Печать многостраничных PDF на разных принтерах - PullRequest
6 голосов
/ 16 августа 2011

Я создаю PDF на PHP с FPDF.Это хорошо работает.

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

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

Ответы [ 4 ]

5 голосов
/ 19 августа 2011

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

3 голосов
/ 21 августа 2011

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

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

1 голос
/ 16 мая 2013

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

1 голос
/ 16 августа 2011

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

...