php - 在 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);
解决方案
你对php的header函数的理解有点偏差。
header() 用于发送原始 HTTP 标头。有关 HTTP 标头的更多信息,请参阅 » HTTP/1.1 规范。
请记住,必须在发送任何实际输出之前调用 header(),无论是通过普通 HTML 标记、文件中的空白行还是从 PHP 发送。使用 include 或 require 函数或其他文件访问函数读取代码并在调用 header() 之前输出空格或空行是一个非常常见的错误。使用单个 PHP/HTML 文件时也存在同样的问题。
您应该临时保存文件,使用流,或从另一个页面/路由链接它
由于这不能回答问题,只是指出不正确使用 header() 我不想作为答案发布,而是按要求这样做
推荐阅读
- android - 无法连接 GoPro HERO (2018) 相机。我无法找到能够连接相机并实际录制实时流的代码库
- javascript - 检查是否填写了必填字段
- sql - Postgresql - 按时间戳和 car_id 分组
- sql - sql - 从多个表中获取同一列的总和
- permissions - Artemis AMQ119213:用户:''没有权限='CONSUME'
- java - 设置重复 java - 从文件导入 - java
- angularjs - AngularJS 图表库
- wpf - MultiDataTrigger中的DataTrigger?
- java - 在 Spring Controller 中存储临时数据
- java - 选择时使工具栏上的主页按钮更改颜色