Объединение двух полстраничных PDF-документов с PHP - PullRequest
1 голос
/ 11 августа 2011

Мой друг работает в газете и спросил меня об этом в понедельник, и я не могу подтвердить, возможно ли это или нет.

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

Представьте себе следующее: у меня есть PDF1: полстраничный PDF, а затем у меня есть 3 страницы PDF: Pdf2. На первой странице PDF2 у меня есть пустое место для PDF1.

Могу ли я сделать это? как?

1 Ответ

0 голосов
/ 27 августа 2011

Я не могу дать вам конкретный исходный код, но могу объяснить, как это сделать на очень низком уровне.Кроме того, то, что вы ищете, похоже на то, что называется наложением в издательской индустрии.

Вы начинаете так же, как слияние, что означает извлечение страниц из другого документа.Вы должны ввести все зависимости страницы рекурсивно.Но будьте осторожны, чтобы избежать бесконечных циклов, которые существуют в PDF, поэтому вы должны отслеживать посещаемый объект.Не используйте рекурсивные функции, потому что ваш стек легко переполняется, ссылки в PDF могут быть очень глубокими.Вы должны реализовать рекурсию обхода в куче (Поиск в глубину в порядке).

Ключом к штамповке PDF в PDF является превращение исходного объекта Page в форму XObject (не смешивать с AcroForms или заполнять с возможностью заполнения).поля формы).Форма XObject очень похожа на объект Page со следующими исключениями:

  • /Type /Page становится /Type /XObject /Subtype /Form.
  • Страница MediaBox и CropBox вместестать /BBox в форме.Но будьте осторожны, они оба могут быть унаследованы через дерево страниц, поэтому вы должны искать унаследованные атрибуты.
  • Страница Rotate (также наследуемая) становится Matrix, что является преобразованием (вращением)матрица, а не угол.
  • * * * * * * * * * * * * * * Metadata страницы могут быть введены без изменений и добавлены к объекту формы.
  • Страница Contents поток долженперенести в форму.Однако страница Contents является внешним объектом и может быть массивом, что означает, что вам нужно объединить части.Форма XObject является потоковым объектом.
  • Все остальные атрибуты хитры, и вы можете игнорировать их, если не уверены.

Как только это будет сделано, все, что вам нужносделать, это нарисовать форму XObject на новой странице.Вы должны сгенерировать уникальное имя для XObject и добавить его к странице Resources.Само рисование представляет собой серию операторов cm и Do, как рисование изображения.Если вам нужно обрезать исходный контент, то вам также нужно установить обтравочный контур до Do.

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

Я не обсуждал некоторые другие детали, такие как управление цветом (что если вы рисуете DeviceRGB на управляемыхCMYK), PDF / A, PDF / X, передача полей аннотаций и форм и т. Д.

Если это не для вас, вам следует искать библиотеку наложения с открытым исходным кодом, потому что она работает практически так же,Верстка означает размещение двух или более страниц на чистом листе бумаги с целью печати книги или флаера.У меня тоже есть коммерческое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...