pdf生成-使用PHP从模板创建新的pdf


pdf generation - Create new PDF from template with PHP

我有一个设置了格式和布局的docx文档文件,我将其保存为PDF文件。我想使用这个pdf文件作为模板,创建预先填充了用户数据的新pdf文件。

我看过FPDF,FPDI,tcPDF,domPDF,ZendPDF,http://koivi.com/fill-pdf-form-fields/(Justin Koivisto),一些转换工具,如HTML2PDF和stackoverflow上提到的一些命令行工具。除了FPDI之外,它们都没有提供示例,使用PDF模板搜索并用实际数据替换自定义标签(通常来自数据库),或者添加数据而不指定一组值,如x、y、postion、字体、字体格式等。

从头开始创建PDF似乎工作量太大。我还没有考虑使用HTML2PDF转换器,因为结果似乎差异很大,然后出现了样式问题。有些工具允许CSS,但通常有一些限制,比如不支持浮动。

是否没有一种简单的方法可以像Excel和PHPExcel一样使用模板?

我的需求是:

  • 免费
  • 加载并使用模板
  • 搜索和替换自定义标记
  • 添加数据(文本、图像、字体、格式化等)
  • 自定义页眉和页脚
  • 必须使用共享主机
  • 允许下载、保存/存储到服务器并附加到最终生成的PDF的电子邮件(最好不必先保存)

我真的很推荐MPDF:

  1. 它基于FPDF和HTML2FPDF,因此您可以使用它们的一些功能或添加其他功能
  2. 它有很多很酷的功能(创建任何类型的条形码、区域设置支持、水印等等)
  3. 它有一个制作精良的文档
  4. 它有一个社区论坛
  5. 它有例子
  6. 它有一个简单的学习曲线

唯一不好的是它有点重,但你可以去掉你不需要的东西。

使用TCPDF您可以使用HTML标签创建PDF模板。它创建速度快、易于使用、易于集成。我用它生成律师事务所的详细发票(多页不同格式)、珠宝车间的生产信封(包括照片)、库存票据和发票。

TCPD示例

尝试FPDI它支持编辑现有模板并在该模板文件中进行更改

用法非常直观:

<?php
require_once('fpdf.php');
require_once('fpdi.php');
$pdf = new FPDI();
$pagecount = $pdf->setSourceFile('TestDoc.pdf');
$tplidx = $pdf->importPage(1, '/MediaBox');
$pdf->addPage();
$pdf->useTemplate($tplidx, 10, 10, 90);
$pdf->Output('newpdf.pdf', 'D');

另请参阅以下链接:PHP中有pdf模板的解决方案吗?

在PHP 中编写/绘制PDF模板文档

http://www.livedocx.com/

LiveDocx是一个基于模板的文档创建平台。

http://www.phplivedocx.org/articles/getting-started-with-phplivedocx/

您可以使用Word或OpenOffice邮件合并功能来创建模板并将数据导入标记中,而不是使用PHP。然后你可以"打印",但以pdf格式导出,而不是实际打印。如果您不需要定期更新模板,这可能是一个更快的解决方案。我为大约150个产品做了这件事,花了不到30分钟的时间,包括创建模板和上传pdf。只是事后想想,希望这能帮助到别人!

尝试使用PDF作为"模板"的问题是PDF是一种排版文档格式。这是一个固定的布局,你不应该把布局搞得太乱。

如果您想对此做更多的工作,那么使用XSL-FO之类的东西从XML"模板"生成文档会简单得多。您所需要做的就是生成具有正确字段的XML,然后XSL-FO渲染器可以为您创建PDF。

最好的(唯一的?)免费XSL-FO渲染器是Apache FOP。

您可以跳过在现有PDF上定义模板的所有痛苦https://github.com/applicius/dhek/releases。它在PDF页面/坐标上创建了一个JSON映射区域,这样您就可以用您喜欢的PDF API填充它。

我在一个项目中需要它,所以我为此创建了一个快速工具。您可以查看它,并随时在这里贡献

如果您的服务器安装了OpenOffice,您可以在无头模式下使用soffice将RTF文件(Rich Text Format)转换为PDF。

  1. 在Text like"中创建带有模板括号的RTF;亲爱的{{姓名}},你好吗"

  2. 打开文件并用$content=file_get_contents('path_to_file'); 加载内容

  3. 根据需要替换文本:$content=str_replace('{{{name}}}', 'Bruce Wanye', $content);

  4. 将内容保存到新文件:file_put_contents('path_to_file2', $content);

  5. 现在转换为PDF:excec("soffice --headless --convert-to pdf 'path_to_file2' --outdir 'target_directory'");

以下是一些如何使用一个PDF模板和HTML内容创建多个页面的示例。基于MPDF库。

$mpdf = new mPDF('utf-8', $format_size, 0, '', $margin_left, $margin_right, $margin_top, $margin_bottom, 0, 0, $orientation);
if ( $bg_template ) { 
    // is a PDF template file
    $mpdf->SetImportUse();
    $pagecount = $mpdf->SetSourceFile( $bg_template );
    $tplIdx = $mpdf->ImportPage( $pagecount );
}
foreach ( $html as $one_letter_text ) {
    $mpdf->addPage();
    if ( $bg_template ) {
        $mpdf->useTemplate( $tplIdx, 0, 0);
    }
    $mpdf->WriteHTML( $one_letter_text );
}
$title = 'my-letter.pdf';
$pdf_path = $this->created_pdf_upload_dir.'/'.$title;
$mpdf->Output( $pdf_path, 'F');