pdflib-PHP:将具有背景颜色的PDI对象作为单个对象/组插入

pdflib-PHP:将具有背景颜色的PDI对象作为单个对象/组插入,php,pdf,pdflib,Php,Pdf,Pdflib,目前正在使用较旧(和最新)版本的pdflib(7.0和9.2)。我想要一个可能的解决方案来处理7。我们有一个应用程序,其中我们从多个较小的PDF文件组成一个PDF文件。这些PDF文件可能没有明确的背景对象集,因此在插入它们时,透明度处于活动状态(即背景发光) 使用PDI插入对象($p指父文档): 只要背景符合预期(即白色),此选项就可以正常工作。在某些情况下,如果有人想要有不同的背景(不同的PDF文件或不同的颜色),我们首先添加一个具有相同大小的白色框,然后在其上绘制PDF文档-有效地为单个插入

目前正在使用较旧(和最新)版本的pdflib(7.0和9.2)。我想要一个可能的解决方案来处理7。我们有一个应用程序,其中我们从多个较小的PDF文件组成一个PDF文件。这些PDF文件可能没有明确的背景对象集,因此在插入它们时,透明度处于活动状态(即背景发光)

使用PDI插入对象(
$p
指父文档):

只要背景符合预期(即白色),此选项就可以正常工作。在某些情况下,如果有人想要有不同的背景(不同的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);
}
这很适合观看。当有人想稍后在Adobe Acrobat或Adobe Illustrator中编辑生成的PDF时,问题就出现了——作为背景绘制的框没有与其他PDF内容组合在一起,这使得处理起来更加困难——您必须确保将白色框移到插入的PDF文件后面

我想在不必在所有源PDF中插入显式背景对象的情况下解决这个问题,因为由于源PDF的数量,这不是一个切实可行的策略

我试图通过创建一个新的PDF文档来解决这个问题,在这个文档中画一个白色的框,然后再次将PDF插入到这个文档中。这似乎需要将pdf写入磁盘,然后将其加载,出于性能原因,我希望避免这种情况。文档中说可以使用“虚拟pdf文件”,但我在pdflib文档中找不到对此的任何引用。当我试图从内存中的PDF创建PDI文档时,下面的代码会出错

$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文档,但这导致了分割错误。很遗憾,我再也没有这种尝试的代码了


因此,对于如何通过PDI在插入的PDF中获得默认的白色背景色,或者如何将绘制的框与PDI插入的对象合并,有什么建议的解决方案吗?

主要问题如下:

这很适合观看。当有人想稍后在Adobe Acrobat或Adobe Illustrator中编辑生成的PDF时,问题就出现了——作为背景绘制的框没有与其他PDF内容组合在一起,这使得处理起来更加困难——您必须确保在插入的PDF文件后面移动白色框

由于PDF是最终格式,因此不打算在以后进行编辑。因此,没有“分组”或其他逻辑编辑信息可用

因此,操纵PDF文件将永远不会可靠地工作,就像您有一个为其设计的文档格式一样

因此,它取决于应用程序是否将PDF元素识别为一个组。使用当前AcrobatDC版本时,我无法将整个导入页面作为单个对象移动。它为我提供了几个较小的物体来移动

=>我不建议编辑PDF文件。

但根据您的描述,您使用的Acrobat/Illustrator版本似乎将XObject视为可以移动的单个对象。如果这个假设是正确的,您可以将白色矩形和PDI页面封装在一个模板中。 此解决方案可能适用于当前版本,但可能不适用于更高版本

有关此功能的详细介绍,请参阅PDFlib 9.2教程,第3.2.4章“模板(表单XObject)”,PDFlib Cookbook中的示例也演示了它的使用。过时的PDFlib 7中也提供了模板,但在过去十年中已经扩展

关于PVF:在starter_PVF示例中演示了PVF的使用,该示例包含在PDFlib 7和9下载包中。(可在PDFlib食谱中找到)
在您的情况下,应该在内存中创建第一个文档,并使用get_buffer()检索数据。对于新文档,使用新名称和get_buffer()的内容创建一个新的PVF文件。然后使用open_pdi_document()打开此文件。在这种情况下,您的光盘上没有任何文件。

根据雷纳的上述回答,我得出了以下有效的结论——最后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_文档
open_pdi_页面
移动到模板上下文之外。结果仍如预期。

太好了,谢谢!我会尝试创建一个模板或测试,如果我可以用PVF。我熟悉使用PDF作为可编辑格式的局限性,但它适用于当前用例。我正在努力节省一点手动花费的时间。我明天会发布最新消息。在这种情况下,更改输出格式是不可行的,因为在通过管道的大多数运行中,所有内容都直接进行打印(使用配置文件),但在一些少量运行中,需要手动干预。输入也是纯PDF文件,因此这是迄今为止最稳定、最兼容的方式。使用模板可以按照您的建议工作。非常感谢您的帮助和您在pdflib上所做的工作(我猜您就是那个雷纳)。
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, "");
}