You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Dompdf生成不可复制选择的PDF的实现方案咨询

实现不可选择PDF的几种方案

方案一:将HTML转为图片后嵌入PDF

你考虑的转JPG嵌入PDF的方案完全可行,核心是先把HTML渲染成高清图片,再将图片放入适配A4尺寸的HTML模板中用DOMPDF生成PDF,这样PDF里只有图片元素,自然无法选择文本。

实现步骤:

  1. 用wkhtmltoimage工具将HTML转为高分辨率图片(服务器需提前安装wkhtmltopdf工具包),PHP中可通过命令行调用:
// 生成高清JPG图片
exec('wkhtmltoimage --quality 100 --dpi 300 input.html output.jpg');
  1. 构建包含图片的HTML模板:
$imageHtml = '<!DOCTYPE html>
<html>
<head>
    <style>
        body { margin: 0; padding: 0; }
        img { width: 210mm; height: 297mm; display: block; }
    </style>
</head>
<body>
    <img src="output.jpg" alt="content">
</body>
</html>';
  1. 用你的DOMPDF代码渲染这个模板:
$html = mb_convert_encoding($imageHtml, 'HTML-ENTITIES', 'UTF-8');
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
$dompdf->stream("dompdf_out.pdf", array("Attachment" => false));

方案二:给PDF添加透明遮挡图层

无需转图片,在DOMPDF生成的PDF基础上,用FPDI+FPDF给每一页覆盖一个透明矩形图层,用户选择时只会选中无内容的图层,无法触及下方文本。

实现步骤:

  1. 先让DOMPDF生成PDF并保存到服务器:
$html = mb_convert_encoding($pdf_html, 'HTML-ENTITIES', 'UTF-8');
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
$output = $dompdf->output();
file_put_contents('temp.pdf', $output);
  1. 用FPDI加载PDF并添加遮挡图层:
require_once('fpdf/fpdf.php');
require_once('fpdi/fpdi.php');

$pdf = new FPDI();
$pageCount = $pdf->setSourceFile('temp.pdf');

for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {
    $tplIdx = $pdf->importPage($pageNo);
    $pdf->addPage();
    $pdf->useTemplate($tplIdx);
    
    // 绘制覆盖整页的透明矩形
    $pdf->SetFillColor(255, 255, 255, 0); // 最后一位为透明度0(完全透明)
    $pdf->Rect(0, 0, 210, 297, 'F'); // A4尺寸:210mm×297mm
}

$pdf->Output('protected.pdf', 'I');
unlink('temp.pdf'); // 删除临时文件

方案三:用Ghostscript设置PDF权限

通过Ghostscript工具修改PDF的权限配置,直接禁用文本复制功能,这是PDF标准的权限控制方式。

实现步骤:

  1. 先生成临时PDF(同方案二第一步)。
  2. 调用Ghostscript命令设置权限:
// 执行命令禁用复制权限,可根据需求调整参数
exec('gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPermissions=0 -dOwnerPassword=your_pass -dOutputFile=protected.pdf temp.pdf');

// 输出处理后的PDF
header('Content-Type: application/pdf');
header('Content-Disposition: inline; filename="protected.pdf"');
readfile('protected.pdf');

// 清理临时文件
unlink('temp.pdf');
unlink('protected.pdf');

参数说明:

  • -dPermissions=0:禁用所有权限(包括复制、打印);若需保留打印权限,可设为-dPermissions=4
  • -dOwnerPassword:设置所有者密码,用于后续修改权限

内容的提问来源于stack exchange,提问作者hakanerenler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 19:21:06