В настоящее время используется более старая (и последняя) версия 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?