【问题标题】:How to overlay HTML generated PDF on top of existing PDF?如何在现有 PDF 之上覆盖 HTML 生成的 PDF?
【发布时间】:2016-08-13 14:54:37
【问题描述】:

我希望从一个包含图形和文本的初始 PDF 文件开始,然后获取一些具有某些用户输入动态值的 html 代码,将其生成为 PDF,希望使用初始 PDF 作为背景,或者之后以某种方式运行 PHP 脚本以“合并”两个 PDF,其中一个充当背景。

我有一些代码可以呈现 HTML 格式的 PDF:(使用 DOMPDF)

$initialpdf = file_get_contents('file_html.html');

$initialpdf = str_replace(array(
        '%replaceText1%',
        '%replaceText2%'
    ), array (
        $replaceText1,
        $replaceText2,
    ), $initialpdf);

$fp = fopen('file_html_new.html','w');
file_put_contents('file_html_new.html', $initialpdf);

require_once("dompdf/dompdf_config.inc.php");
spl_autoload_register('DOMPDF_autoload');
function pdf_create($html, $filename, $paper, $orientation, $stream=TRUE)
{
    $dompdf = new DOMPDF();
    $dompdf->set_paper($paper,$orientation);
    $dompdf->load_html($html);
    $dompdf->render();
    $pdf = $dompdf->output();
    @file_put_contents($filename . ".pdf", $pdf);
}
$filename = 'HTML_Generated_pdf';
$dompdf = new DOMPDF();
$html = file_get_contents('file_html_new.html'); 
pdf_create($html,$filename,'Letter','landscape');

上面的代码采用 html 文件“file_html.html”并用用户输入值替换字符串,将其呈现为名为“file_html_new.html”的新 HTML 文件,然后将其呈现为 PDF。

我还有其他 PHP 代码通过将 PDF 作为初始源来呈现 PDF:(使用 FPDF)

<?php
ob_clean();
ini_set("session.auto_start", 0);
define('FPDF_FONTPATH','font/');
define('FPDI_FONTPATH','font/');
require('fpdf.php');
require('fpdi.php');

$pdf = new FPDI();
$pdf->setSourceFile("/home/user/public_html/wp-content/myPDF.pdf");
$tplIdx = $pdf->importPage(1);
$specs = $pdf->getTemplateSize($tplIdx);
$pdf->addPage($specs['h'] > $specs['w'] ? 'P' : 'L', 'Letter');
$pdf->useTemplate($tplIdx,  0, 0);

$pdf->SetFont('helvetica');
$pdf->SetXY(30, 30);
$pdf->Write(0, $replaceText1);
ob_end_clean();
$pdf->Output('New_Generated_PDF.pdf', 'F');
?>

这需要一个已经存在的 PDF,“myPDF.pdf”,并将其用作背景,将一些传入的值写入文档,并保存新生成的文档。

虽然这基本上是我想要做的,但我需要使用 html,因为文本的精确格式变得严格,并且几乎不可能通过手动绘制来完成。

我愿意使用 DOMPDF、FPDF、FPDI、TCPDF 或任何其他 PHP 资源来完成此操作。

有没有办法融合我上面的两种方式?

【问题讨论】:

  • 为此我会推荐一个基于会话的文件名。当用户提交表单时,他/她会在服务器上创建一个 PDF 文件。文件名将是用户会话。使用 [scandir()](php.net/manual/en/function.scandir.php) 或 file_exists() 检查该特定用户是否有任何 PDF 并显示所有 pdf 文件;如果存在具有该用户会话的文件,请使用另一个提交按钮将文件名放入您的第二个代码中。
  • @MawiaHL 这不是我的问题的根源,它已经保存为基于会话的文件名,带有动态文件名插件。问题是在另一个 PDF 之上呈现一个 PDF。意思是 1 页 + 1 页 = 1 页某种方式,而不是单独的渲染。

标签: php wkhtmltopdf tcpdf fpdf dompdf


【解决方案1】:

当然,您也可以通过 FPDI 使用不同的现有 PDF 文档。这段代码应该向您展示概念(实际上我猜所有页面格式都是 A4 纵向):

<?php

$pdf = new FPDI();

// let's get an id for the background template
$pdf->setSourceFile('myPDF.pdf'); 
$backId = $pdf->importPage(1);

// iterate over all pages of HTML_Generated_pdf.pdf and import them
$pageCount = $pdf->setSourceFile('HTML_Generated_pdf.pdf');
for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {
    // add a page
    $pdf->AddPage();
    // add the background
    $pdf->useTemplate($backId);
    // import the content page
    $pageId = $pdf->importPage($pageNo);
    // add it
    $pdf->useTemplate($pageId);
}

$pdf->Output();

【讨论】:

  • 这不会制作 2 页的 pdf 对吧?我正在寻找它是一个单页 pdf,其中两页相互重叠。
  • 你通读了代码吗?如果 HTML_Generated_pdf.pdf 只有一页,它将产生 1 页... myPDF.pdf 的第 1 页将用作所有页面的背景。逻辑很琐碎,我想不需要进一步解释......试试看怎么样?
  • 我刚刚尝试过并将其格式化为我的代码。你是绝对正确的,它的工作!我不得不自己添加几行,但它完全可以操作!现在就为您的精彩答案投票!
猜你喜欢
  • 1970-01-01
  • 2022-10-05
  • 2015-07-17
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多