DOMPDF - 如何在另一个 PDF 文件之上书写文本 (PHP)
DOMPDF - How to write text on top of another PDF file (PHP)
举例来说,我想加载一个已经存在的 PDF 文件,然后在该 PDF 文件之上转置文本并将其再次保存为一个新的 PDF 文件。本质上是将两者合并,一个被调换到另一个上。
我不希望作为背景的 PDF 变成图像而失去质量,因此所有内容都保留其原始矢量格式。
我将如何进行合并?
我不想使用软件,也许有一个脚本可以做到这一点?
不清楚您打算在什么情况下执行此操作,并且您的过程描述表明您希望在现有内容之上叠加(或溢流)文本,而不是转置它。如果您使用任何支持解析输入 PDF 并接受新内容作为新 PDF 对象的实用程序打开文档,则没有什么可以阻止您将新文本放在旧文本之上。如果在屏幕上查看,旧的 material 将首先呈现,然后是占据相同 (x,y) 坐标的任何较新的 material。换句话说,现有的 PDF material 在应用新内容之前不需要呈现为图像形式。
但是请注意,如果您打算通过覆盖现有的 material 来编辑它,这将不是执行此操作的方法,因为 newer/upper 对象不会直接影响其他人在下面。可以将上面的对象拖到一边(例如使用 Acrobat)以查看它们下面的内容。
dompdf 本身无法执行此类操作。您需要独立生成 PDF 文档,然后使用第三方库合并这两个文档。
由于您使用的是 dompdf,我猜您可能正在寻找基于 PHP 的解决方案。看看FPDI。使用 dompdf 生成 PDF 文档后,您可以使用 FPDI 将它们合并。
我认为这会起作用,但我还没有测试过:
<?php
// generate pdf documents
require_once('dompdf/autoload.inc.php');
$dompdf = new Dompdf();
$dompdf->loadHtml('<p>Hello</p>');
$dompdf->render();
file_put_contents('doc1.pdf', $dompdf->output());
unset($dompdf);
$dompdf = new Dompdf();
$dompdf->loadHtml('<p> </p><p>Hello</p>');
$dompdf->render();
file_put_contents('doc2.pdf', $dompdf->output());
// combine pdf documents
require_once('fpdf.php');
require_once('fpdi.php');
// initiate FPDI
$pdf = new FPDI('L');
// add a page
$pdf->AddPage();
// set the source file to doc1.pdf and import a page
$pdf->setSourceFile("doc1.pdf");
$tplIdx = $pdf->importPage(1);
// use the imported page and place it at point 10,10 with a width of 210 mm
$pdf->useTemplate($tplIdx, 10, 10, 210);
// set the source file to doc2.pdf and import a page
$pdf->setSourceFile("doc2.pdf");
$tplIdx = $pdf->importPage(1);
// use the imported page and place it at point 100,10 with a width of 210 mm
$pdf->useTemplate($tplIdx, 100, 10, 210);
$pdf->Output();
举例来说,我想加载一个已经存在的 PDF 文件,然后在该 PDF 文件之上转置文本并将其再次保存为一个新的 PDF 文件。本质上是将两者合并,一个被调换到另一个上。
我不希望作为背景的 PDF 变成图像而失去质量,因此所有内容都保留其原始矢量格式。
我将如何进行合并?
我不想使用软件,也许有一个脚本可以做到这一点?
不清楚您打算在什么情况下执行此操作,并且您的过程描述表明您希望在现有内容之上叠加(或溢流)文本,而不是转置它。如果您使用任何支持解析输入 PDF 并接受新内容作为新 PDF 对象的实用程序打开文档,则没有什么可以阻止您将新文本放在旧文本之上。如果在屏幕上查看,旧的 material 将首先呈现,然后是占据相同 (x,y) 坐标的任何较新的 material。换句话说,现有的 PDF material 在应用新内容之前不需要呈现为图像形式。
但是请注意,如果您打算通过覆盖现有的 material 来编辑它,这将不是执行此操作的方法,因为 newer/upper 对象不会直接影响其他人在下面。可以将上面的对象拖到一边(例如使用 Acrobat)以查看它们下面的内容。
dompdf 本身无法执行此类操作。您需要独立生成 PDF 文档,然后使用第三方库合并这两个文档。
由于您使用的是 dompdf,我猜您可能正在寻找基于 PHP 的解决方案。看看FPDI。使用 dompdf 生成 PDF 文档后,您可以使用 FPDI 将它们合并。
我认为这会起作用,但我还没有测试过:
<?php
// generate pdf documents
require_once('dompdf/autoload.inc.php');
$dompdf = new Dompdf();
$dompdf->loadHtml('<p>Hello</p>');
$dompdf->render();
file_put_contents('doc1.pdf', $dompdf->output());
unset($dompdf);
$dompdf = new Dompdf();
$dompdf->loadHtml('<p> </p><p>Hello</p>');
$dompdf->render();
file_put_contents('doc2.pdf', $dompdf->output());
// combine pdf documents
require_once('fpdf.php');
require_once('fpdi.php');
// initiate FPDI
$pdf = new FPDI('L');
// add a page
$pdf->AddPage();
// set the source file to doc1.pdf and import a page
$pdf->setSourceFile("doc1.pdf");
$tplIdx = $pdf->importPage(1);
// use the imported page and place it at point 10,10 with a width of 210 mm
$pdf->useTemplate($tplIdx, 10, 10, 210);
// set the source file to doc2.pdf and import a page
$pdf->setSourceFile("doc2.pdf");
$tplIdx = $pdf->importPage(1);
// use the imported page and place it at point 100,10 with a width of 210 mm
$pdf->useTemplate($tplIdx, 100, 10, 210);
$pdf->Output();