在Laravel Blade视图中即时显示PDF(Content-type:application / pdf)

时间:2018-06-26 09:54:14

标签: php laravel laravel-5

我已经在Laravel中创建了DHL标签创建脚本,并在Controller中获取了生成的PDF。 “ $ image”是根据用户输入创建的,并由DHL API即时提供。通常(在普通的PHP脚本中,而不是在Laravel中),我们执行以下操作以显示PDF,因为我认为它工作正常:

header("Content-type:application/pdf");
header("Content-Disposition:inline;filename=label_123demo.pdf");
echo $image; 

因此,在控制器文件中,我编写了如下代码:

$data['image'] = $image; // generated image from DHL API
return view('Administrator.shipments.dhl-post', $data);

在Blade文件中,我写了以下内容:

<div style="border: 2px solid #B0AFBE; width:800px;">
@php
header("Content-type:application/pdf");
header("Content-Disposition:inline;filename=label_123demo.pdf");
echo $image; 
@endphp
</div>

但是什么也没显示。

DHL标签创建脚本如下:

$message_ref = '';
            for ($i=0; $i< 30; $i++)
            {
                $message_ref .= rand(0, 9);

            }   
            $message_time = date("Y-m-d") . "T" . date("H:i:sP");
            $ab_date = date("Y-m-d", strtotime("+1 day")); 

$query =<<<EOT
<?xml version="1.0" encoding="ISO-8859-1"?>\n
<req:ShipmentValidateRequest xmlns:req="http://www.dhl.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.dhl.com ship-val-req.xsd">\n
<Request>\n
<ServiceHeader>\n
<MessageTime>$message_time</MessageTime>\n
<MessageReference>$message_ref</MessageReference>\n
<SiteID>XXXX</SiteID>\n
<Password>XXXX</Password>\n
</ServiceHeader>\n
</Request>\n
<RequestedPickupTime>N</RequestedPickupTime>\n
<NewShipper>N</NewShipper>\n
<LanguageCode>en</LanguageCode>\n
<PiecesEnabled>Y</PiecesEnabled>\n
<Billing>\n
<ShipperAccountNumber>XXXXX</ShipperAccountNumber>\n
<ShippingPaymentType>S</ShippingPaymentType>\n
<BillingAccountNumber>XXXXX</BillingAccountNumber>\n
<DutyPaymentType>R</DutyPaymentType>\n
</Billing>\n
<Consignee>\n
<CompanyName>XYZ</CompanyName>\n
<AddressLine>XXXXXX</AddressLine>\n
<City>Lekki</City>\n
<Division>Lagos</Division>\n
<DivisionCode>LG</DivisionCode>\n
<PostalCode>98981</PostalCode>\n
<CountryCode>NG</CountryCode>\n
<CountryName>Nigeria</CountryName>\n
<Contact>\n
<PersonName>MyName</PersonName>\n
<PhoneNumber>713-530-1160</PhoneNumber>\n
<PhoneExtension></PhoneExtension>\n
</Contact>\n
</Consignee>\n
<Dutiable>\n
<DeclaredValue>200</DeclaredValue>\n
<DeclaredCurrency>USD</DeclaredCurrency>\n
<TermsOfTrade>DAP</TermsOfTrade>\n
</Dutiable>\n
<Reference>\n
<ReferenceID>13</ReferenceID>\n
<ReferenceType>St</ReferenceType>\n
</Reference>\n
<ShipmentDetails>\n
<NumberOfPieces>3</NumberOfPieces>\n
<Pieces><Piece>\n
<PieceID>3</PieceID>\n
<PackageType>EE</PackageType>\n
<Weight>8</Weight>\n
<DimWeight>8</DimWeight>\n
<Width>6</Width>\n
<Height>8</Height>\n
<Depth>8</Depth>\n
<PieceContents></PieceContents>\n
</Piece></Pieces>\n
<Weight>287</Weight>\n
<WeightUnit>L</WeightUnit>\n
<GlobalProductCode>P</GlobalProductCode>\n
<Date>2018-06-27</Date>\n
<Contents>SHIPMENT #13</Contents>\n
<DoorTo>DD</DoorTo>\n
<DimensionUnit>I</DimensionUnit>\n
<PackageType>EE</PackageType>\n
<IsDutiable>N</IsDutiable>\n
<CurrencyCode>USD</CurrencyCode>\n
</ShipmentDetails>\n
<Shipper>\n
<ShipperID>XXXXXX</ShipperID>\n
<CompanyName>MyCompany</CompanyName>\n
<RegisteredAccount>XXXXX</RegisteredAccount>\n
<AddressLine>Address XYX demo</AddressLine>\n
<City>Tuscon</City>\n
<Division>Iowa</Division>\n
<DivisionCode>IW</DivisionCode>\n
<PostalCode>50020</PostalCode>\n
<CountryCode>US</CountryCode>\n
<CountryName>United States</CountryName>\n
<Contact>\n
<PersonName>PersonName</PersonName>\n
<PhoneNumber>12345600</PhoneNumber>\n
<PhoneExtension></PhoneExtension>\n
</Contact>\n
</Shipper>\n
<EProcShip>N</EProcShip>\n
<LabelImageFormat>PDF</LabelImageFormat>\n
<RequestArchiveDoc>Y</RequestArchiveDoc>\n
<Label>\n
<LabelTemplate>8X4_thermal</LabelTemplate>\n
<Logo>Y</Logo>\n
<Resolution>200</Resolution>\n
</Label>\n
</req:ShipmentValidateRequest>
EOT;

$url = "https://xmlpi-ea.dhl.com/XMLShippingServlet?isUTF8Support=true";

        $ch = curl_init($url);
        #curl_setopt($ch, CURLOPT_MUTE, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
        curl_setopt($ch, CURLOPT_POSTFIELDS, "$query");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($ch);
        curl_close($ch);
preg_match("/<OutputImage>(.*?)<\/OutputImage>/", $output, $matches);
$image = base64_decode($matches[1]);
$data['image'] = $image;
$data['demo'] = "demo.pdf";
return view('Administrator.shipments.dhl-post', $data);

1 个答案:

答案 0 :(得分:2)

您对php标头功能的了解略有不同。

Link to php header manual

  

header()用于发送原始HTTP标头。参见»HTTP / 1.1   规范以获取有关HTTP标头的更多信息。

     

请记住必须在任何实际输出之前调用header()   通过常规HTML标记,文件中的空白行或通过PHP发送。   读取包含或要求的代码是一个非常常见的错误   函数或其他文件访问函数,并且有空格或空   在header()调用之前输出的行。同样的问题   使用单个PHP / HTML文件时存在。

您应该临时保存文件,使用流或从另一个页面/路由链接它

PHP Temp File Manual

因为这不能回答问题,所以仅指出我不希望将header()用作回答,而是通过请求这样做了