如何在php中将Pdf文件转换为字节数组并发送?
我在java、dotnet和python中发现了pdf到字节数组,反之亦然。但我想在php laravel中将pdf转换为字节数组。我使用的是会计软件解决方案“IMUIS”,需要将日记账分录从laravel lumen发送到“IMUIS”进行处理。但转换后会出现错误 “Foutmelding”:“Kan een object van het type System.String niet converteren naar het type System.Byte[]” 在英语中这意味着 “错误消息”:“无法将System.String对象转换为System.Byte[]类型。” 文件如下所示: 这是它的代码如何在php中将Pdf文件转换为字节数组并发送?,php,laravel-5,lumen-5.4,Php,Laravel 5,Lumen 5.4,我在java、dotnet和python中发现了pdf到字节数组,反之亦然。但我想在php laravel中将pdf转换为字节数组。我使用的是会计软件解决方案“IMUIS”,需要将日记账分录从laravel lumen发送到“IMUIS”进行处理。但转换后会出现错误 “Foutmelding”:“Kan een object van het type System.String niet converteren naar het type System.Byte[]” 在英语中这意味着 “错误消
public function saveJournal($values = '') {
//echo "adasd";dd();
$partnerKey = $values->input('Partnerkey');
$omgevingscode = $values->input('Environmentcode');
$file = file_get_contents($values->file('Pdffile'));
$str = base64_encode($file);
$options = array(
\WsdlToPhp\PackageBase\AbstractSoapClientBase::WSDL_URL => env('IMUIS_URL'),
\WsdlToPhp\PackageBase\AbstractSoapClientBase::WSDL_CLASSMAP => ClassMap::get(),
);
$login = new \mysdk\ImuisSDK\ServiceType\Login($options);
if ($login->Login(new \mysdk\ImuisSDK\StructType\Login($partnerKey, $omgevingscode)) !== false) {
$sessionid = $login->getResult()->SessionId;
}
$array = [
'BOE' => [
'JR' => '2018',
'PN' => '5',
'DAGB' => 20,
'REK' => 20032,
'TEGREK' => '40',
'FACT' => 0,
'BTW' => 4,
'BEDRBOEK' => 123.45,
'DAT' => '08-05-2018',
'OPM' => 'Anand testing from wsdl',
'BEDRBTW' => 21,
'FACT' => 0,
'OMSCHR' => 'Testing from wsdl api',
'BOEKSTUK' => 2018075
],
'DIGDOS' => [
'FILE' => $str
]
];
$journaalpost = ArrayToXml::convert($array, 'NewDataSet');//convert array to xml string
$create = new \mysdk\ImuisSDK\ServiceType\Create($options);
if ($create->CreateJournaalpost(new \mysdk\ImuisSDK\StructType\CreateJournaalpost($partnerKey, $omgevingscode, $sessionid, $journaalpost)) !== false) {
$jsonResponse = $create->getResult();
} else {
$jsonResponse = $create->getLastError();
}
return $jsonResponse;
}
以下是回应:
{
"success": true,
"result": {
"CreateJournaalpostResult": false,
"Journaalpost": "<?xml version=\"1.0\"?>\n<NewDataSet><BOE><JR>2018</JR><PN>5</PN><DAGB>20</DAGB><REK>20032</REK><TEGREK>40</TEGREK><FACT>0</FACT><BTW>4</BTW><BEDRBOEK>123.45</BEDRBOEK><DAT>08-05-2018</DAT><OPM>Anand testing from wsdl</OPM><BEDRBTW>21</BEDRBTW><OMSCHR>Testing from wsdl api</OMSCHR><BOEKSTUK>2018075</BOEKSTUK></BOE><DIGDOS><FILE>JVBERi0xLjMKMyAwIG9iago8PC9UeXBlIC9QYWdlCi9QYXJlbnQgMSAwIFIKL1Jlc291cmNlcyAyIDAgUgovQ29udGVudHMgNCAwIFI+PgplbmRvYmoKNCAwIG9iago8PC9GaWx0ZXIgL0ZsYXRlRGVjb2RlIC9MZW5ndGggMzg2Pj4Kc3RyZWFtCniclZNPb9pAEMXvfIp3TA8Zdme93jE3G0xFJWgKJtdolbhICTYU6L9v3zWEGKnUVeST1++9+b2xzfjUU2QdfvayAv2xRkJKofiKvOh9g00ssUCFS0xMzFDNY0uxw2OF/kRjtMGXxms06QSOLUnwP+Fmkd+lyMr9wddP+9r7aoDxfFE8NOfaKqtZO+PoV7X+gOK5mdekSBhg/opJfb0qK+9fDthsB2Cl5VbZWx1D80DZAbtzhiIX2iiSJGBTIoLd6mo1hRXesGMRSuxx3ixNpxjl2aRY5vPX1NDwzcASk1GXjnE6LJbL+Ww5nV51RCykokvHZDZMF5+R5aN5+rF1BJ2xcDoiY1DBSmBT5/s1FqceDPl3D8fEpxmj8schLB/DTbX19e+OJq1Hc+Q6CrTCJBzwFeUrhQ1fTfROitYTs+mAaHVamU4KI8TmnRStJ+Zr0WeKVvefVbBu/prjS6/333e+fiwx9bVflbs9MrqnDpjWq7WRDpoLYSTOUXyxwD9RUucvCmVuZHN0cmVhbQplbmRvYmoKMSAwIG9iago8PC9UeXBlIC9QYWdlcwovS2lkcyBbMyAwIFIgXQovQ291bnQgMQovTWVkaWV5s7I11RFTyPO/t9OL74tl5/das6enN0bXwr//AKZ629kqeo76x9P/AOOs4y+N/wDK6nJuq/7nerWTI6zQrTReVjEVir+fVST/AF1m6Wrf7W+uMQ+o/D744dNdW2I8fKx2Ny8nCOrKu5j18zJOGq/JoeLX9ndp47YfR9t7+zUmmy59IPG9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuIAowMDAwMDc2NDgzIDAwMDAwIG4gCjAwMDAwNzY1NTkgMDAwMDAgbiAKdHJhaWxlcgo8PAovU2l6ZSAxMQovUm9vdCAxMCAwIFIKL0luZm8gOSAwIFIKPj4Kc3RhcnR4cmVmCjc2NjA5CiUlRU9GCg0KCiAgICAgIA==</FILE></DIGDOS></NewDataSet>\n",
"Primarykey": null,
"Foutmelding": "Kan een object van het type System.String niet converteren naar het type System.Byte[]."
}
}
{
“成功”:没错,
“结果”:{
“CreateJournaalpostResult”:false,
“JournalPost”:"\n2018520200324004123.4508-05-2018A来自WSDL21的测试来自wsdl API2018075JVBERI0xLJMKMYAWIG9IAGO8PCUEXBLIC9QYWDLCI9QYXJLBNQGMSAWIFIKL1JLC291CMNLcyayidagugovQ29UDGVUdhmgncaWifi+PGPLBMRVYMOKNCAWIG9IAGO8PC9GAW0ZXIGL0ZYXRRGVJB2RLIC9MZW5NDGGGMZG2PG2PJ4KJ4RYZWFTCLZNFECLZN9PAEZIP3TG3TZYUK9ZFJJJJJ9ZFZFZFZFK9WZFZFZFZFZFZFZZK9++2.在一个研究领域中,这个研究是一个研究领域的一个研究领域的一个研究领域的一个研究领域的一个研究领域+Fmkd+现在的WDDP+9个研究领域的一个研究领域,一个非准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准JBZWFEURHQ1FTFROITYTS+m6/333e+这两个词的意思意思是:一个词的意思意思意思是:一个词的意思意思是:一个词的意思意思是,一个词的意思是,一个词的意思是,一个词的意思是,一个词的意思是,一个词的意思是,一个词的意思是,一个词的意思是,一个词的意思是,一个词的意思是,一个词的意思是,一个词的意思是,一个单词的意思是一个单词的意思是一个单词的意思是一个单词的意思意思是一个单词的意思意思是一个单词的意思意思是一个单词的意思意思是一个单词的意思意思是一个单词的意思意思是一个单词的意思意思是一个单词的意思意思意思是一个单词的意思意思意思意思意思意思是一个单词的意思意思意思是一个单词的意思意思意思意思意思是一个单词的意思意思意思意思意思意思意思意思意思意思是一个单词的意思是2I8FKX2NY8NCORKU5J18ZJOGQ/JoeLX9ndp47YfR9t7+Zummy59IPG9waaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababawawzy1NtKgmdAwzy1NtKgmdAwKg8PaoVu2L6ZaxmqOv9VdCaxCawFik8GsAwKj4kCc3RhcnR4cmVc2Nc2Nc2njakCulru9GCg0Igagicgicgica=\n“,
“Primarykey”:空,
“Foutmelding”:“Kan een object van het type System.String niet converteren naar het type System.Byte[]”
}
}
要将PDF转换为字节数组,您必须使用文件获取内容()
读取文档,然后通过函数解包()
对其进行解析
createJournalPost(新建\mysdk\imuisdk\StructType\createJournalPost($partnerKey、$omgevingscode、$sessionid、$journalPost))!==false){
$jsonResponse=$create->getResult();
}否则{
$jsonResponse=$create->getLastError();
}
返回$jsonResponse;
}
?>
我认为问题在于WsdlToPhp
构造了客户端代码,当PDF实体需要是字节[]
时,它将以字符串的形式发送
所以我认为问题可能出在这里没有显示的代码中
您能否查看一下由WsdlToPhp
生成的代码,看看您是否可以灵活地将$journaalpost
序列化,以确定是否可以在其中进行修复?//将Base64字符串转换回文本。
// Convert the Base64 string back to text.
var byteString = atob(data.reportBase64Bytes);
// Convert that text into a byte array.
var ab = new ArrayBuffer(byteString.length);
var ia = new Uint8Array(ab);
for (var i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
// Blob for saving.
var blob = new Blob([ia], { type: "application/pdf" });
// Tell the browser to save as report.pdf.
saveAs(blob, "report.pdf");
// Alternatively, you could redirect to the blob to open it in the browser.
//document.location.href = window.URL.createObjectURL(blob);
var byteString=atob(data.reportbase64字节);
//将该文本转换为字节数组。
var ab=新阵列缓冲区(byteString.length);
var ia=新的UINT8阵列(ab);
for(var i=0;i
有一个错误“在IMUIS软件中,因此无法从php链接pdf文件。它可以由Dotnet完成,因为它的母语和整个系统都是由Dotnet构建的。感谢我所有的SO朋友们为帮助我找到问题所做的努力,我在呼叫支持后确认了此信息。所以在未来没有人会被卡住(毕竟可能在2018年底):)它的文档是荷兰语的,所以请先通过翻译页面将其转换为英语:)这里缺少一些东西。您显示的错误消息是一条C#错误消息,但您的代码都是PHP。哪个系统返回此错误?它来自“IMUIS”的Api响应。他们的Api必须被破坏,因为您根据他们的文档正确地执行了此操作。是的,我想是有东西坏了。但是成千上万的人在使用它。我们如何解决这个错误?我没有找到任何已经使用IMUI的开发人员。所以如何将其转换为base64 encode(),因为我们无法从base64_encode()转换数组,只能转换字符串。你知道吗?我更新了答案并添加了正确的代码。试试看。不再需要使用函数base64\u encode()
。函数unpack()
应该可以工作。{“success”:false,“error”:“DOMDocument::loadXML():StartTag:实体中的元素名称无效,需要行:2”}base64\u编码。请查看文档。我在回答中更新了代码。尝试通过file\u get\u contents()
获取文件,然后使用unpack()
转换为字节数组,使用base64\u encode(serialize($byte\u array))
获取编码数组。我认为我在简单的php中发送的bcoz不太丰富。这是一个jquery的东西,我希望它出现在php上。
// Convert the Base64 string back to text.
var byteString = atob(data.reportBase64Bytes);
// Convert that text into a byte array.
var ab = new ArrayBuffer(byteString.length);
var ia = new Uint8Array(ab);
for (var i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
// Blob for saving.
var blob = new Blob([ia], { type: "application/pdf" });
// Tell the browser to save as report.pdf.
saveAs(blob, "report.pdf");
// Alternatively, you could redirect to the blob to open it in the browser.
//document.location.href = window.URL.createObjectURL(blob);