recherche

Maison  >  Questions et réponses  >  le corps du texte

Le PDF protégé par mot de passe ne peut pas être ouvert en PHP DOMPDF

J'ai créé la protection par mot de passe en utilisant le code suivant,

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

Cela fonctionne bien lorsque je télécharge le fichier.

Je sauvegarde également ce fichier sur le serveur avant de le télécharger. Mais lorsque j'essaie de télécharger le fichier plus tard, il ne peut pas être ouvert avec le mot de passe correct. Si je ne définis pas de protection par mot de passe, cela fonctionne correctement

Quelqu'un peut-il m'aider ?

P粉950128819P粉950128819241 Il y a quelques jours358

répondre à tous(1)je répondrai

  • P粉428986744

    P粉4289867442024-03-27 10:44:35

    J'ai trouvé le problème. Il existe une clé nommée "p" sur le tableau d'informations cryptées, qu'ils appellent la "valeur p". Lorsque le PDF est diffusé, la valeur p passe de 252 à -4. La partie du code qui fait cela est commentée :

    Étant donné que la valeur p change lors de la première sortie, la deuxième fois que vous sortez le pdf, il écrit le fichier avec la mauvaise valeur.

    Il me semble que vous avez deux solutions. La première consiste à générer d'abord le PDF dans un fichier, puis à écrire votre propre code pour faire écho à ce fichier dans le navigateur, ou vous pouvez réinitialiser la valeur p entre le flux et la sortie comme ceci :

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

    J'espère que cela aide.

    répondre
    0
  • Annulerrépondre