首页 > 解决方案 > 在 Laravel Blade 视图中显示动态 PDF(内容类型:应用程序/pdf)

问题描述

我在 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);

标签: phplaravellaravel-5

解决方案


你对php的header函数的理解有点偏差。

链接到 php 标头手册

header() 用于发送原始 HTTP 标头。有关 HTTP 标头的更多信息,请参阅 » HTTP/1.1 规范。

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

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

PHP 临时文件手册

由于这不能回答问题,只是指出不正确使用 header() 我不想作为答案发布,而是按要求这样做


推荐阅读