使用Dompdf生成不可复制选择的PDF的实现方案咨询
实现不可选择PDF的几种方案
方案一:将HTML转为图片后嵌入PDF
你考虑的转JPG嵌入PDF的方案完全可行,核心是先把HTML渲染成高清图片,再将图片放入适配A4尺寸的HTML模板中用DOMPDF生成PDF,这样PDF里只有图片元素,自然无法选择文本。
实现步骤:
- 用
wkhtmltoimage工具将HTML转为高分辨率图片(服务器需提前安装wkhtmltopdf工具包),PHP中可通过命令行调用:
// 生成高清JPG图片 exec('wkhtmltoimage --quality 100 --dpi 300 input.html output.jpg');
- 构建包含图片的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>';
- 用你的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给每一页覆盖一个透明矩形图层,用户选择时只会选中无内容的图层,无法触及下方文本。
实现步骤:
- 先让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);
- 用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标准的权限控制方式。
实现步骤:
- 先生成临时PDF(同方案二第一步)。
- 调用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
相关产品推荐
相关产品推荐

