Le PDF protégé par mot de passe ne peut pas être ouvert en PHP DOMPDF
P粉950128819
P粉950128819 2024-03-26 13:33:59
0
1
361

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粉950128819
P粉950128819

répondre à tous(1)
P粉428986744

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal