1

各PDFのPDFバイトデータを含むリスナーの配列を適切に反復処理し、それぞれを個別のテキストファイルに書き込む方法はありますか? 私はこれに 3 日間取り組んできましたが、最初の 1 つしか書けませんでした。

編集:これは、私がそれを取り除いた新しいコードです:

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);
}

私はこれを使用していました:

$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->DocumentPDFs の print_r です:

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->DocumentPDFs->DocumentPDF の print_r:

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 にドリルダウンすると、基本的に同じ PDF が返されます。何故ですか?

新しい編集- したがって、foreach 呼び出しを に変更$xml->DocumentPDFs->DocumentPDF->PDFBytes as $valueし、同じアイテムに対して print_r を実行すると、DocumentPDF の印刷は同じものを返しますが、DocumentPDF の印刷は 1 つのオブジェクトを返します。私が見る限り、正しく解析しています。

さらに新しい編集- foreach ループを次のように変更しました。

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を書き出すことはまだできません。何かご意見は?

最新の編集- だから私はそれを通常の配列にしました:

$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を印刷しているだけです。私は何を間違っていますか?!

4

1 に答える 1

0

PHP では、foreach()ループは適切にフォーマットされた配列に対してのみ機能します。現在ループしている場合:

foreach($xml->DocumentPDFs->DocumentPDF as $value) 
{
...
}

そしてそれは一度だけループし、それは次のいずれかを意味します:

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 オブジェクトに正しく解析していることを確認しましたか? var_dump()for ループの各反復中に各レベル (つまり、DocumentPDFs、DocumentPDFs->DocumentPDF) でorを実行するprint_r()と、おそらく問題の場所が明らかになります。


アップデート

これに到達して、次の PHP コードを操作することができました。これを使ってみてください、それは私のために働きます。PDFBytes はすべてのデータを出力に書き込むため、今のところコメントアウトしました。コメントを解除する前にこれを試して、一意のドキュメント名とタイプを取得しているかどうかを確認してください...

<?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);        
}
?>
于 2013-09-19T22:18:25.707 に答える