0

我正在使用php wkhtmltopdf从 html 创建一个 pdf

如果我将文件直接保存到我的服务器,则 pdf 有效

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

如果我先将其转换为字符串,然后使用 php 将其保存到文件中,则 pdf 文件仍然有效。

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

但是无论我尝试包含什么标题,下载的pdf文件都不起作用,当我检查它时,它充满了�符号(据我所知,通常来自不正确的编码)

我已经尝试了所有我能想到的标头配置,但仍然得到相同的结果:

以下是我的一些尝试:

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

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

以下是下载前后 pdf 文件的内容示例:

下载前:

%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úÌ]w@Gfl£É†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◊´ÜÚˆ‚&amp;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-∆&amp;÷{ ‹˛ãŒòŒÁ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

下载后:

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��]w@Gߣ��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�|�&gt;n/i�]2ɪ���U���W�����������J��.J.Y
 Y���
�-����vd-�&amp;�{ ���Θ��e�Z�حW�*��YJ�I)�����ՠ����z���c�n`5�܅_����r�K��O�Bo��V^�1(�A`@�Ё�7_�S�&lt;j-R��d��A����ʛ|�m|�GD��zT�_��e:)a��
4

1 回答 1

1

我注意到的一件事是您的 PDF 在标题行下没有推荐的二进制注释。

从PDF参考:

注意:如果 PDF 文件包含二进制数据,大多数情况下(参见第 3.1 节,“词汇约定”),建议在标题行之后紧跟包含至少四个二进制字符的注释行——即,代码为 128 或更大的字符。这将确保文件传输应用程序的正确行为,这些应用程序检查文件开头附近的数据以确定是否将文件的内容视为文本或二进制文件。

例如。

%PDF-1.4
%����

那是在 node as 中写的%\xFF\xFF\xFF\xFF,我不确定 PHP 中的等价物是什么。

我在 phpwkhtmltopdf 或 wkhtmltopdf 中看不到任何与此直接相关'encoding' => 'UTF-8'的选项,但是 shell 命令有一个选项。

我建议探索这方面的选项,因为看起来服务器和您之间的某些东西正在破坏文件中的 unicode。

于 2017-03-19T13:42:25.277 回答