受密码保护的 PDF 无法在 PHP 中打开 DOMPDF

问题描述 投票:0回答:3

我使用以下代码创建了密码保护,

$dompdf = new Dompdf(array('enable_remote' => true));
$dompdf->loadHtml($html_print);
#(Optional) Setup the paper size and orientation
$dompdf->setPaper('A4', 'landscape');
#Render the HTML as PDF
$dompdf->render();
#PASSWORD PROTECTION
$dompdf->getCanvas()
    ->get_cpdf()
    ->setEncryption(1234, 5678, ['print', 'modify', 'copy', 'add']);
#Output the generated PDF to Browser
$dompdf->stream($filename);
#SAVE THE FILE TO SERVER
$output = $dompdf->output();
$filename =  $filename.'-'.time().'.pdf';
file_put_contents('../documents/'.$filename, $output);

当我下载文件时它工作得很好。

在下载之前,我也将此文件保存在服务器中。但是当我稍后尝试下载该文件时,它无法使用正确的密码打开。如果我没有设置密码保护就可以顺利运行

有人可以帮助我吗?

php pdf-generation dompdf
3个回答
1
投票

发现问题了。加密信息数组上有一个名为“p”的密钥,他们将其称为“p 值”。当 PDF 被流式传输时,p 值从 252 变为 -4。执行此操作的代码部分有注释:

并且需要转换 p 值以考虑二进制补码方法

因为 p 值在第一次输出期间发生了变化,所以第二次输出 pdf 时,它会以错误的值写入文件。

在我看来,你有两种解决方法。第一种方法是先将 PDF 输出到文件,然后编写自己的代码将该文件回显到浏览器,或者您可以重置流和输出之间的 p 值,如下所示:

#PASSWORD PROTECTION
$cpdf = $dompdf->getCanvas()
    ->get_cpdf();

$cpdf->setEncryption(1234, 5678, ['print', 'modify', 'copy', 'add']);

#Output the generated PDF to Browser
$infoB4 = $cpdf->objects[$cpdf->arc4_objnum]['info'];
$dompdf->stream($filename);

#SAVE THE FILE TO SERVER
$cpdf->objects[$cpdf->arc4_objnum]['info'] = $infoB4;
$output = $dompdf->output();

希望有帮助。


0
投票
$pdf->getDomPDF()->getCanvas()->get_cpdf()->setEncryption("viewer_password", "my_password");

0
投票

嗨,情况怎么样?问题,除了 dompdf 之外,您还使用过其他库吗?

© www.soinside.com 2019 - 2024. All rights reserved.