首页
学习
活动
专区
圈层
工具
发布

用DomPdf从多个html文档生成pdf

使用 DomPDF 从多个 HTML 文档生成 PDF

基础概念

DomPDF 是一个 PHP 库,能够将 HTML 和 CSS 转换为 PDF 文档。它支持大多数 CSS 2.1 和部分 CSS 3 属性,可以很好地处理表格、图像和基本布局。

优势

  1. 开源免费:DomPDF 是开源项目,可以免费使用
  2. HTML/CSS 支持:能够处理复杂的 HTML 和 CSS 样式
  3. PHP 原生:作为 PHP 库,与 PHP 项目集成方便
  4. 轻量级:相比其他 PDF 生成方案,DomPDF 相对轻量

从多个 HTML 文档生成 PDF 的方法

方法一:合并 HTML 内容后生成 PDF

代码语言:txt
复制
require_once 'dompdf/autoload.inc.php';

use Dompdf\Dompdf;

// 初始化 Dompdf
$dompdf = new Dompdf();

// 从多个文件读取 HTML 内容
$html1 = file_get_contents('page1.html');
$html2 = file_get_contents('page2.html');
$html3 = file_get_contents('page3.html');

// 合并 HTML 内容
$combinedHtml = $html1 . $html2 . $html3;

// 加载 HTML 内容
$dompdf->loadHtml($combinedHtml);

// 设置纸张大小和方向
$dompdf->setPaper('A4', 'portrait');

// 渲染 PDF
$dompdf->render();

// 输出 PDF
$dompdf->stream("combined_document.pdf", array("Attachment" => false));

方法二:使用分页符分隔多个文档

代码语言:txt
复制
require_once 'dompdf/autoload.inc.php';

use Dompdf\Dompdf;

$dompdf = new Dompdf();

$html1 = file_get_contents('page1.html');
$html2 = file_get_contents('page2.html');
$html3 = file_get_contents('page3.html');

// 使用 CSS 分页符分隔文档
$combinedHtml = $html1 . 
                '<div style="page-break-before: always;"></div>' . 
                $html2 . 
                '<div style="page-break-before: always;"></div>' . 
                $html3;

$dompdf->loadHtml($combinedHtml);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
$dompdf->stream("multi_page_document.pdf");

方法三:逐个生成后合并 PDF(使用 PDF 合并库)

代码语言:txt
复制
require_once 'dompdf/autoload.inc.php';
require_once 'fpdi/src/autoload.php';

use Dompdf\Dompdf;
use setasign\Fpdi\Fpdi;

// 生成第一个 PDF
$dompdf1 = new Dompdf();
$dompdf1->loadHtml(file_get_contents('page1.html'));
$dompdf1->render();
file_put_contents('temp1.pdf', $dompdf1->output());

// 生成第二个 PDF
$dompdf2 = new Dompdf();
$dompdf2->loadHtml(file_get_contents('page2.html'));
$dompdf2->render();
file_put_contents('temp2.pdf', $dompdf2->output());

// 合并 PDF
$pdf = new Fpdi();
$files = ['temp1.pdf', 'temp2.pdf'];

foreach ($files as $file) {
    $pageCount = $pdf->setSourceFile($file);
    for ($i = 1; $i <= $pageCount; $i++) {
        $pdf->AddPage();
        $pdf->useTemplate($pdf->importPage($i));
    }
}

// 输出合并后的 PDF
$pdf->Output('merged.pdf', 'D');

// 删除临时文件
unlink('temp1.pdf');
unlink('temp2.pdf');

常见问题及解决方案

问题 1:样式不一致或丢失

原因:不同 HTML 文档可能有冲突的 CSS 规则

解决方案

  • 确保所有文档使用一致的 CSS 基础
  • 考虑为每个文档添加命名空间类
  • 或者在合并前预处理 HTML,确保样式统一

问题 2:分页不正确

原因:DomPDF 自动分页可能不符合预期

解决方案

  • 使用 page-break-before: alwayspage-break-after: always 手动控制分页
  • 调整内容避免在元素中间分页

问题 3:大文档性能问题

原因:DomPDF 处理大文档时可能内存不足

解决方案

  • 增加 PHP 内存限制 ini_set('memory_limit', '512M');
  • 考虑分批次生成后合并(如方法三)
  • 优化 HTML/CSS 减少复杂性

问题 4:中文/特殊字符显示问题

解决方案

代码语言:txt
复制
$dompdf->loadHtml(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
$dompdf->set_option('defaultFont', 'SimSun'); // 设置支持中文的字体

应用场景

  1. 报告生成:将多个数据报告合并为一个 PDF
  2. 电子书制作:合并多个章节为完整电子书
  3. 合同文档:组合多个条款和附件
  4. 教学材料:合并讲义、习题和答案
  5. 产品手册:整合产品说明、规格和用户指南

性能优化建议

  1. 缓存生成的 PDF 以避免重复生成
  2. 对于大量文档,考虑使用队列异步处理
  3. 简化 HTML/CSS 结构提高渲染速度
  4. 考虑使用 CSS 媒体查询优化打印样式
  5. 对大图片进行压缩处理
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的文章

领券