将标准Base64编码流输出为PDF格式(PHP)

时间:2015-10-14 14:15:16

标签: php api pdf stream base64

我使用Royal Mail Shipping API生成打印的PDF标签,我的PHP SoapClient返回如下所示的有效响应(仅显示初始响应,因为整个响应很大)。

%PDF-1.7 %äãÏÒ 4 0 obj <> stream xœ endstream endobj 3 0 obj 8 endobj 9 0 obj <> stream xÚí]bì*¤Höýoübƒ¤Æ-q²É>ø%Íë‚ÔFÒ<1ÆoÌúÝú¯ý?1Æ%Èa9Ò4QÌ!}üŠ ÆãS€ZÿŸ2Mô¨H}üßÇcŒ˜Z´½\¡´üý’y©1Æø$¨RÓd°úø’ÆÄŒ1Ægð´ ¨Š'ª°Z¾MCF1Æ}¥/¨{d˜ZQ•†Þ7Æ_P¢õ‘ kjŒ1.J¦ê”ÕÑŽ©,ž‹1ÆãNÿÅIü{}L%üÄcŒÑS Þª€êÁI”ÀÅÃcŒcHÚsïuP5Ð4Æ .ê2¤mbŒ1vU¼vè:ž>Æ<´¾1ÆØTŠûfÓ¢œÆcTŒ³wGF1Æ 

任何人都可以提出最佳方法来转换&#39;这个Base64编码的PDF标签正确,所以我可以将其物理下载到浏览器。我下面的代码下载了PDF文件但是当我尝试打开它时,文件大小总是57kb,我在Acrobat Reader中返回以下消息

"There was an error opening this document. The file is damaged and could not be repaired."

我的代码如下:

$rm = new RoyalMailLabelRequest();
// provide shipment number, order tracking id, output format (e.g PDF/PNG)
$response = $rm->PrintLabel('TTT000358756GB', '276831601444829801', 'PDF');

header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="doc-'.$document.'.pdf"');
$data = base64_decode($response);
file_put_contents('pdf/label.pdf', $data);

更新

当我尝试回应已解码的响应时,我得到以下内容......不确定这个发生了什么......奇怪。

$response = $rm->PrintLabel('TTT000358756GB', '276831601444829801', 'PDF');
$data = base64_decode($response);
echo $data;exit;

在base64_decoded之后回显&#d;数据响应

<1uï(n?Ëzx-‡}üX¥µêÿV­x7œ¡×¬¶·š›

我还添加了我的代码在pastebin上返回的完整base64_encode响应,如果它可以帮助任何人 http://pastebin.com/JEtmRURK

1 个答案:

答案 0 :(得分:1)

排序 - 这是一个非常漫长的一天。

我最近不需要解码响应,所以以下内容可行(希望它可以帮助其他人进行API集成)

function PrintLabelRequest($shipmentNumber, $transactionId)
{
   $rm = new RoyalMailLabelRequest();

   // function from library returns a response using SOAP
   $response = $rm->PrintLabel($shipmentNumber, $transactionId);

   // name the file & saved this label as a PDF in the following folder
   $filename = 'printedlabel-' . $shipmentNumber;
   file_put_contents(dirname(__FILE__) . '/labels/'. $filename .'.pdf', $response);
}