pdflib - PHP: вставка объекта PDI с цветом фона в качестве одного объекта / группы - PullRequest
0 голосов
/ 22 января 2020

В настоящее время используется более старая (и последняя) версия pdflib (7.0 и 9.2). Я хотел бы, чтобы возможное решение работало с 7. У нас есть приложение, в котором мы составляем один файл PDF из нескольких меньших файлов PDF. Этим файлам PDF может не быть задан явный фоновый объект, поэтому они вставляются с активной прозрачностью (т. Е. Фон просвечивает).

Объекты вставляются с использованием PDI ($p относится к родительскому документу):

$pdf_doc = PDF_open_pdi_document($p, $file, "");
$image = PDF_open_pdi_page($p, $pdf_doc, 1, "");
PDF_fit_pdi_page($p, $image, $x, $y, $boxsize . " position 50 fitmethod meet");
PDF_close_pdi_page($p, $image);

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

function draw_box($pdf, $offset_x, $offset_y, $width, $height) {
    PDF_setcolor($pdf, 'fill', 'cmyk', 0, 0, 0, 0);
    PDF_rect($pdf, $offset_x, $offset_y, $width, $height);
    PDF_fill($pdf);
}

Это прекрасно работает для просмотра. Проблема возникает, когда кто-то хочет отредактировать полученный PDF позже в Adobe Acrobat или Adobe Illustrator - поле, которое было нарисовано, поскольку фон не сгруппирован вместе с остальным содержимым PDF, что усложняет работу с ним - вы должны убедитесь, что вы также перемещаете белое поле за вставленным PDF-файлом.

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

Я попытался обойти эту проблему, создав новый документ PDF, нарисовав белое поле внутри этого документа, а затем снова вставив PDF в этот документ. Кажется, для этого нужно записать pdf на диск и затем загрузить его, чего я бы хотел избежать из соображений производительности. В документации сказано, что можно использовать «виртуальный файл PDF», но я не смог найти никаких ссылок на это в документации PDF. Приведенный ниже код раздражает, когда я пытаюсь создать документ PDI из PDF-файла в памяти.

$inserted = PDF_new();
PDF_begin_document($inserted, "", '');
$inserted_page = PDF_begin_page_ext($inserted, 20, 20, '');

$pdf_doc = PDF_open_pdi_document($inserted, $file, "");
$image = PDF_open_pdi_page($inserted, $pdf_doc, 1, "");
PDF_fit_pdi_page($inserted, $image, $x, $y, $boxsize . " position 50 fitmethod meet");
PDF_close_pdi_page($inserted, $image);

// then create a PDI document to insert into the parent
// This barfs, since it expects a file.
$new = PDF_open_pdi_document($p, $inserted, "");

Я также пытался рисовать непосредственно в документе PDI, но это привело к ошибке сегментации. К сожалению, у меня больше нет кода для этой попытки.

Так что любые предложенные решения для того, как получить белый цвет фона по умолчанию во вставленном PDF через PDI, или для слияния нарисованного блока с объектом, вставленным PDI?

Ответы [ 2 ]

1 голос
/ 22 января 2020

Основная проблема заключается в следующем:

Это прекрасно работает для просмотра. Проблема возникает, когда кто-то хочет отредактировать полученный PDF позже в Adobe Acrobat или Adobe Illustrator - поле, которое было нарисовано, поскольку фон не сгруппирован вместе с остальным содержимым PDF, что усложняет работу с ним - вам придется убедитесь, что вы также перемещаете белое поле за вставленным файлом PDF

Поскольку формат PDF является окончательным, он не предназначен для последующего редактирования. Поэтому никакие «группировки» или другая логическая информация редактирования недоступны.

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

Следовательно, от приложения зависит, распознает ли он элементы PDF как группу или нет. При использовании текущей версии Acrobat D C мне не удалось переместить всю импортированную страницу как один объект. Он предлагает мне несколько небольших объектов для перемещения.

=> Я бы не рекомендовал редактировать PDF-файлы.

Но из вашего описания видно, что используемые вами версии Acrobat / Illustrator рассматривают XObject как единый объект что ты можешь двигаться. Если это предположение верно, вы можете заключить белый прямоугольник и страницу PDI в шаблон. Этот обходной путь может работать для ваших текущих версий, но может не работать в более поздних версиях.

Подробное введение в эту функцию см. В руководстве по PDFlib 9.2, глава 3.2.4 " Шаблоны (формы XObjects)", и его использование также продемонстрировано в примере " повторное содержимое " в PDFlib Cookbook. Шаблоны также доступны в устаревшей PDFlib 7, но были расширены в последнее десятилетие.

О PVF: использование PVF продемонстрировано в примере starter_pvf, который включен в пакеты загрузки PDFlib 7 и 9. (и доступно в PDFlib cookbook "starter_pvf" ). В вашем случае вы должны создать первый документ в памяти и получить данные с помощью get_buffer (). Для нового документа создайте новый файл PVF с новым именем и содержимым get_buffer (). Затем откройте этот файл с помощью open_pdi_document (). В этом случае у вас нет файлов на диске c.

0 голосов
/ 23 января 2020

Основываясь на ответе Райнера, приведенном выше, я получил следующее, которое работает - и в итоге получил один объект в Illustrator. $pdf является содержащим PDF:

function draw_box($pdf, $offset_x, $offset_y, $width, $height)
{
    PDF_setcolor($pdf, 'fill', 'cmyk', 0, 0, 0, 0);
    PDF_rect($pdf, $offset_x, $offset_y, $width, $height);
    PDF_fill($pdf);
}

function insert_pdf_file($pdf, $file, $offset_x, $offset_y, $page = 1)
{
    $src = PDF_open_pdi_document($pdf, $file, "");
    $page = PDF_open_pdi_page($pdf, $src, $page, "");

    // Insert PDF page into current PDF
    PDF_fit_pdi_page($pdf, $page, $offset_x, $offset_y, "");
}

function insert_pdf_file_with_background($pdf, $inserted, $offset_x, $offset_y, $width, $height)
{
    $grouped = PDF_begin_template_ext($pdf, $width, $height, '');
    draw_box($pdf, 0, 0, $width, $height);
    insert_pdf_file($pdf, $inserted, 0, 0);
    PDF_end_template($pdf);

    PDF_fit_image($pdf, $grouped, $offset_x, $offset_y, "");
}

Для pdflib 7 мне пришлось переместить open_pdi_document и open_pdi_page вне контекста шаблона. Результат все еще как ожидалось.

...