2017-03-12 6 views
0

Je crée un pdf de HTML en utilisant php wkhtmltopdfComment obtenir pdf créé avec PHP WkHtmlToPdf télécharger avec Slim 3 sans codage casser

Si j'enregistrez le fichier directement sur mon serveur, le pdf fonctionne

$pdf->saveAs('/path/to/mypdf.pdf'); 

Si je le convertis d'abord en chaîne puis que je l'enregistre dans un fichier avec php, le fichier pdf fonctionne toujours.

$content = $pdf->toString(); 
$file = '/path/to/mypdf.pdf'; 
file_put_contents($file, $content); 

Mais peu importe ce que les en-têtes, je l'ai essayé d'inclure, le fichier téléchargé le fichier pdf ne fonctionne pas, et quand je visite, il est plein de symboles (qui, autant que je sache, provient généralement de codage incorrect)

J'ai essayé toutes les configurations d'en-tête que je peux penser, et je reçois toujours le même résultat:

Voici quelques de mes tentatives:

$response = $response->withHeader('Content-type', 'application/pdf'); 
$content = $pdf->toString(); 
$response->write($content); 

et

$response = $response->withHeader('Content-Type', 'application/pdf'); 
$response = $response->withHeader('Pragma', "public"); 
$response = $response->withHeader('Content-disposition', 'attachment; filename=test.pdf'); 
$response = $response->withHeader('Content-Transfer-Encoding', 'binary'); 
$response = $response->withHeader('Content-Length', strlen($content)); 
$response = $response->write($content); 
return $response; 

Voici un échantillon de contenu des fichiers PDF avant et après le téléchargement:

avant le téléchargement:

%PDF-1.4 
1 0 obj 
<< 
/Title (˛ˇMyPDF Test type1) 
/Creator (˛ˇwkhtmltopdf 0.12.3) 
/Producer (˛ˇQt 4.8.7) 
/CreationDate (D:20170312220641+02'00') 
>> 
endobj 
3 0 obj 
<< 
/Type /ExtGState 
/SA true 
/SM 0.02 
/ca 1.0 
/CA 1.0 
/AIS false 
/SMask /None>> 
endobj 
4 0 obj 
[/Pattern /DeviceRGB] 
endobj 
7 0 obj 
<< 
/Type /XObject 
/Subtype /Image 
/Width 301 
/Height 181 
/BitsPerComponent 8 
/ColorSpace /DeviceGray 
/Length 8 0 R 
/Filter /FlateDecode 
>> 
stream 
xúÌ][email protected]fl£É†R,®à 
å 
[DçöœäΩ˜D£±ã[å∆ª£bÕg"v 
®{/ÿQ∞+E§fi|ª;≥w{ª≥ºF>˘˝°∑;˝«ÓÏõ˜fiº!,|ÇÍU∂!§·P¡ªÇgÖåú$,}ªœ€uÒ—ÎåÔ/Ôûfl∑í£ïºí•ÇÇ]%õ)·)’á*}~=r˜mFF∆ãQ·≠‹Kà’V=®Æµk÷®^›fløJï ï¸|+VÙˆ™‡QäPt)$"Ã$a˝ï1©ëdFn_ÕøA◊´ÜÚˆ‚&n2äñ9FÂæ]M"õÂ&∫7 
3îìØ—ÅîΩ}*˝ΩkÄ4Nªÿ¨£ƒ9Ké"(ôŒπL2#·3‰:æπ+c|$◊áYJd´Ùê˛¸"ê\z¿CL˚o‘≤ƒf∑;#É,–ÿv3˝ˇ©2í£h¯úÓfiJ©|«>n/i™]2…™˙Ä U∏üÍ∑W†˝¸≈˛∏¸•œ ‡JŸ“.J.Y 
YøäÁ≤ 
ª-fi‰ù‚Û£vd-∆&÷{ ‹˛ãŒòŒÁeêZñÿ≠W≤*˝ÆYJÚ£áI)ö˜¢™ã’†≤ü©⁄zÛ‘—cßn`5ˇ‹Ö_¬ı¢Ær˝K¸©O≤Bo©ÎV^Ÿ1(¥A`@˝–Å≥7_»Sß<j-RÖÓdπ›Ảò‹ õ|ém|€GD´¯zTñ_§‹e:)a√˙ 
ÇX€S·pPèd 
»PÚ`EXvRŸNKÆ©sF 

après le téléchargement:

PDF-1.4 

1 0 obj 
<< 
/Title (���M�y�P�D�F� �T�e�s�t� �t�y�p�e�1) 
/Creator (���w�k�h�t�m�l�t�o�p�d�f� �0�.�1�2�.�3) 
/Producer (���Q�t� �4�.�8�.�7) 
/CreationDate (D:20170312222109+02'00') 
>> 
endobj 
3 0 obj 
<< 
/Type /ExtGState 
/SA true 
/SM 0.02 
/ca 1.0 
/CA 1.0 
/AIS false 
/SMask /None>> 
endobj 
4 0 obj 
[/Pattern /DeviceRGB] 
endobj 
7 0 obj 
<< 
/Type /XObject 
/Subtype /Image 
/Width 301 
/Height 181 
/BitsPerComponent 8 
/ColorSpace /DeviceGray 
/Length 8 0 R 
/Filter /FlateDecode 
>> 
stream 
x��][email protected]ߣ��R,�� 
� 
[D��ϊ��D���[����b�g"v 
�{/�Q�+E��|�;�w{���F>����;�����޼!,|��U�!��P���g���$,}���u����/ 

�߷��������]%�)�)��*}~=r�mFFƋQ��K��V=���k� 
n2��9F�]M"��&�7 
3���с��}*��k�4N�ج��9K�"(�ιL2#�3�:��+c|$ׇYJd�����"�\z�CL�oԲ�f�;#�,��v3���2��h����J�|�>n/i�]2ɪ���U���W�����������J��.J.Y 
Y��� 
�-����vd-�&�{ ���Θ��e�Z�حW�*��YJ�I)�����ՠ����z���c�n`5�܅_����r�K��O�Bo��V^�1(�A`@�Ё�7_�S�<j-R��d��A����ʛ|�m|�GD��zT�_��e:)a�� 
+0

Quel système d'exploitation et navigateur? Pour moi sur Windows 10 (chrome/firefox), votre code fonctionne. Btw vous avez un ':' après 'Content-disposition' qui devrait être retiré – jmattheis

+0

@jmatheis Je suis sur OSX principalement sur les tests chrome/firefox pour le moment. Merci pour le non sur l'extra: je l'ai enlevé. – Finglish

Répondre

1

Une chose J'ai remarqué que votre PDF n'a pas le commentaire binaire recommandé sous la ligne d'en-tête.

De la référence PDF:

Remarque: Si un fichier PDF contient des données binaires, comme la plupart ne (voir section 3.1, « ventions lexicales Con- »), il est recommandé que la ligne d'en-tête soit immédiatement suivi d'une ligne de commentaire contenant au moins quatre caractères binaires, c'est-à-dire des caractères dont les codes sont 128 ou plus. Cela assurera le bon comportement des applications de transfert de fichiers qui inspectent les données vers le début d'un fichier pour déterminer si le contenu du fichier doit être traité en tant que texte ou en tant que binaire.

par ex.

%PDF-1.4 
%���� 

Ce qui est écrit dans le nœud comme %\xFF\xFF\xFF\xFF, je ne suis pas sûr de ce que l'équivalent en PHP serait.

Je ne vois aucune option dans phpwkhtmltopdf ou wkhtmltopdf qui semble directement liée à cela, mais il y avait 'encoding' => 'UTF-8' en option à la commande shell.

Je vous recommande d'explorer les options dans ce domaine, car il semble certainement que quelque chose entre le serveur et vous corrompt l'unicode dans le fichier.