【问题标题】:How to convert Pdf file to byte array in php and send?如何将Pdf文件转换为php中的字节数组并发送?
【发布时间】:2018-05-22 06:49:27
【问题描述】:

我在 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 [] 类型。”

文档在这里给出:

doc link

这是它的代码。

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[]."
    }
}

【问题讨论】:

  • 它的文档是荷兰语,所以请先通过翻译页面将其转换为英文:)
  • 这里缺少一些东西。您显示的错误消息是 C# 错误消息,但您的代码都是 PHP。什么系统返回此错误?
  • 它来自“IMUIS”的 Api 响应
  • 他们的 API 必须被破坏,因为您根据他们的文档正确地进行了操作。 cswdoc.imuisonline.com/wp-content/uploads/2015/05/…
  • 是的,我认为它有问题。但是成千上万的人使用它。我们如何解决这个错误?我没有找到任何已经使用 IMUIS 的开发者。

标签: php laravel-5 lumen-5.4


【解决方案1】:

要将 PDF 转换为字节数组,您必须使用 file_get_contents() 读取文档,然后通过函数 unpack() 对其进行解析。

<?php
    public function saveJournal($values = '') {
        $partnerKey = $values->input('Partnerkey');
        $omgevingscode = $values->input('Environmentcode');  
        $file = file_get_contents($values->file('Pdffile'));
        $byte_array = unpack("C*",$file);
        $base64_encode = base64_encode(serialize($byte_array));
        $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' => $base64_encode 
            ]
        ];

        $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;
    }
?>

【讨论】:

  • 那么如何将其转换为 base64 encode() 因为我们不能从 base64_encode() 转换数组,只能转换字符串。你知道吗?
  • 我更新了答案并添加了更正的代码。尝试一下。不再需要使用函数base64_encode()。函数unpack() 应该可以工作。
  • { "success": false, "error": "DOMDocument::loadXML(): StartTag: Entity 中的无效元素名称,行:2" }
  • 需要base64_encode。请看文档。cswdoc.imuisonline.com/?page_id=382
  • 我更新了答案中的代码。尝试通过file_get_contents()获取文件,接下来使用unpack()转换为字节数组,base64_encode(serialize($byte_array))获取编码数组。
【解决方案2】:

我认为问题在于WsdlToPhp 构造了客户端代码,当它需要是byte[] 时,它会将PDF 实体作为String 发送。

所以我认为问题可能出在此处未显示的代码中。

您能否看一下WsdlToPhp 生成的代码,看看您是否可以灵活地对$journaalpost 进行序列化,看看您是否可以在那里修复?

【讨论】:

  • 我认为没有这么丰富的 bcoz 我也发送了简单的 php。
【解决方案3】:
// 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);

【讨论】:

  • 它是一个 jquery 的东西,我想要它在 php 上。
【解决方案4】:

IMUIS 软件中存在一个“bug”,因此无法从 php.ini 链接 pdf 文件。它可能由 Dotnet 完成,因为它的母语和由它构建的整个系统。感谢我所有的 SO 朋友为帮助我找到问题所做的努力,我已在致电支持后确认了此信息。所以在未来没有人被卡住(毕竟可能是 2018 年底):)

【讨论】:

    猜你喜欢
    • 2015-09-16
    • 2012-01-28
    • 2018-02-02
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 2012-06-19
    相关资源
    最近更新 更多