首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迭代PDFBytes数据并写入单独的文本文件

迭代PDFBytes数据并写入单独的文本文件
EN

Stack Overflow用户
提问于 2013-09-19 20:05:51
回答 1查看 229关注 0票数 1

是否有任何方法正确地迭代我的侦听器中的数组,该数组包含每个PDF的PDF字节数据并将每个数组写入一个单独的文本文件?我已经做了三天了,只能让它写第一个,仅此而已。

编辑:这里是我将其简化为:

代码语言:javascript
复制
foreach($xml->DocumentPDFs->DocumentPDF as $value) {
    $value = $value->PDFBytes;
    $binary = base64_decode($value);
    file_put_contents($xml->EnvelopeStatus->EnvelopeID . "/" . $xml->EnvelopeStatus->DocumentStatuses->DocumentStatus->Name . ".pdf", $binary);
}

我在用这个:

代码语言:javascript
复制
$docarr = array();
foreach($xml->DocumentPDFs as $DocumentPDFs){
    foreach ($DocumentPDFs->DocumentPDF as $DocumentPDF) {
        $docarr[] = $DocumentPDF->PDFBytes;
        foreach ($docarr as $pdfbyte) {
            $docfiles = $xml->EnvelopeStatus->EnvelopeID . "/" . $xml->EnvelopeStatus->DocumentStatuses->DocumentStatus->Name . '.txt';
            $doctxt = fopen($docfiles,"w");
            write($doctxt,$pdfbyte);
            fclose($doctxt);
        }
    }
}

出于某种原因,它只在第一个块上迭代,打印,然后停在那里。

新编辑-所以我只是将XML加载到simplexml_load_file中。这是$xml->DocumentPDF上的print_r:

代码语言:javascript
复制
SimpleXMLElement Object
(
    [DocumentPDF] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [Name] => Corporate_Information.pdf
                    [PDFBytes] => JVBERi0xLjQKJfv8/f4KMiAwIG9iago8PAovTW9kRGF0ZSAo...
                    [DocumentType] => CONTENT
                )

            [1] => SimpleXMLElement Object
                (
                    [Name] => LLC_Information.pdf
                    [PDFBytes] => JVBERi0xLjQKJfv8/f4KMiAwIG9iago8PAovTW9kRGF0Z...
                    [DocumentType] => CONTENT
                )

            [2] => SimpleXMLElement Object
                (
                    [Name] => Demo Document.pdf
                    [PDFBytes] => JVBERi0xLjQKJfv8/f4KNiAwIG9iago8PAovUGFyZW5...
                    [DocumentType] => CONTENT
                )

            [3] => SimpleXMLElement Object
                (
                    [Name] => CertificateOfCompletion_4b79ca0d-bbc4-4b2b-9993-295755d3b3ad.pdf
                    [PDFBytes] => JVBERi0xLjQKJfv8/f4KMiAwIG9iago...
                    [DocumentType] => SUMMARY
                )

        )

    )

$xml上的print_r ->DocumentPDF->DocumentPDF:

代码语言:javascript
复制
SimpleXMLElement Object
(
    [Name] => Corporate_Information.pdf
    [PDFBytes] => JVBERi0xLjQKJfv8/f4KMiAwIG9iago8PAovTW9kRGF0ZSAoRDoyMDEzMD...
    [DocumentType] => CONTENT
)

SimpleXMLElement Object
(
    [Name] => Corporate_Information.pdf
    [PDFBytes] => JVBERi0xLjQKJfv8/f4KMiAwIG9iago8PAovTW9kRGF0ZSAoRDoyMD...
    [DocumentType] => CONTENT
)

SimpleXMLElement Object
(
    [Name] => Corporate_Information.pdf
    [PDFBytes] => JVBERi0xLjQKJfv8/f4KMiAwIG9iago8PAovTW9kRGF0ZSAoRDoyMDEzMDkx...
    [DocumentType] => CONTENT
)

SimpleXMLElement Object
(
    [Name] => Corporate_Information.pdf
    [PDFBytes] => JVBERi0xLjQKJfv8/f4KMiAwIG9iago8PAovTW9kRGF0ZSAoR...
    [DocumentType] => CONTENT
)

由于某种原因,它正确地返回了DocumentPDF,但是当我深入到DocumentPDF中时,它返回的基本相同。为什么会这样呢?

更新的编辑-所以我只是更改了对$xml->DocumentPDFs->DocumentPDF->PDFBytes as $value的foreach调用,对相同的项执行了一个print_r,DocumentPDF上的打印返回了相同的内容,但是DocumentPDF上的打印返回了一个对象。据我所知,我的解析是正确的。

更多的新编辑--我将foreach循环更改为:

代码语言:javascript
复制
foreach($xml->DocumentPDFs as $DocumentPDFs) {
    foreach ($DocumentPDFs->DocumentPDF as $DocumentPDF) {
        foreach ($DocumentPDF->PDFBytes as $pdfbytes) {
            $binary = base64_decode($pdfbytes);
            file_put_contents($xml->EnvelopeStatus->EnvelopeID . "/" . $xml->EnvelopeStatus->DocumentStatuses->DocumentStatus->Name . ".pdf", $binary);
        }
    }
}

然后我又做了一次打印,DocumentPDF上的那个现在打印了正确的信息。不过,我还是不能把所有的PDF都写出来。有什么想法吗?

最新编辑-所以我把它变成了一个常规数组:

代码语言:javascript
复制
$json = json_encode($xml);
$array = json_decode($json,TRUE);
foreach($array['DocumentPDFs']['DocumentPDF'] as $DocumentPDF){
    $binary = base64_decode($DocumentPDF['PDFBytes']);
    file_put_contents($xml->EnvelopeStatus->EnvelopeID . "/" . $xml->EnvelopeStatus->DocumentStatuses->DocumentStatus->Name . ".pdf", $file);
}

但它仍然只是打印最后的PDF。我做错什么了?!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-19 22:18:25

在PHP中,foreach()循环只在格式正确的数组上工作。如果您当前正在循环使用:

代码语言:javascript
复制
foreach($xml->DocumentPDFs->DocumentPDF as $value) 
{
...
}

它只循环一次,这意味着:

代码语言:javascript
复制
1.  $xml->DocumentPDFs->DocumentPDF is not a valid / properly formatted array OR
2.  There is only one PDF in the given envelope (i.e. only 1 array element)

假设您正在使用一个包含多个PDF的信封进行测试,您是否验证了将xml正确地解析到您的$xml对象中?您可能希望在每个级别(即DocumentPDF、DocumentPDF->DocumentPDF)执行var_dump()print_r(),这可能会暴露问题所在。

更新

我能够使用下面的PHP代码来完成这个任务。试着用这个,它对我有用。我现在已经注释掉了PDFBytes,因为它将所有的数据写入输出,在un-注释之前尝试一下,看看您是否获得了唯一的文档名称和类型.

代码语言:javascript
复制
<?php
$xml = file_get_contents("PATH_TO_YOUR_XML_FILE");
$obj = new SimpleXMLElement($xml);

foreach($obj->{'DocumentPDFs'}->DocumentPDF as $value) 
{
    print_r($value->Name);
    print_r($value->DocumentType);
    //print_r($value->PDFBytes);        
}
?>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18903942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档