我使用以下代码创建了密码保护,
$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);
当我下载文件时它工作得很好。
在下载之前,我也将此文件保存在服务器中。但是当我稍后尝试下载该文件时,它无法使用正确的密码打开。如果我没有设置密码保护,它可以顺利工作
谁能帮我吗?
P粉4289867442024-03-27 10:44:35
发现问题了。加密信息数组上有一个名为“p”的密钥,他们将其称为“p 值”。当 PDF 被流式传输时,p 值从 252 变为 -4。执行此操作的代码部分有注释:
由于 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();
希望对您有所帮助。