搜尋

首頁  >  問答  >  主體

受密碼保護的 PDF 無法在 PHP 中開啟 DOMPDF

我使用以下程式碼建立了密碼保護,

$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粉950128819P粉950128819325 天前461

全部回覆(1)我來回復

  • P粉428986744

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

    希望對您有幫助。

    回覆
    0
  • 取消回覆