Passwortgeschützte PDFs können nicht in PHP DOMPDF geöffnet werden
P粉950128819
P粉950128819 2024-03-26 13:33:59
0
1
401

Ich habe den Passwortschutz mit dem folgenden Code erstellt,

$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);

Es funktioniert einwandfrei, wenn ich die Datei herunterlade.

Ich speichere diese Datei vor dem Herunterladen auch auf dem Server. Wenn ich jedoch später versuche, die Datei herunterzuladen, kann sie nicht mit dem richtigen Passwort geöffnet werden. Wenn ich keinen Passwortschutz einstelle, funktioniert es reibungslos

Kann mir jemand helfen?

P粉950128819
P粉950128819

Antworte allen(1)
P粉428986744

发现问题了。加密信息数组上有一个名为“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();

希望对您有所帮助。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage