0

「CONTENIDO」というノードを持つ XML ファイルがあります。このノードには、base64 文字列でエンコードされた PDF ファイルがあります。

このノードを読み取り、base64 で文字列をデコードして、PDF ファイルを自分のコンピューターにダウンロードしようとしています。

問題は、ファイルが元の PDF と同じサイズ (kb) でダウンロードされ、ページ数も同じであるということですが...すべてのページがコンテンツなしで空白になり、ダウンロードしたファイルを開くとポップアップが表示されます。 「不明な固有の 806.6n」というエラーが表示されます。それが何を意味するのかわかりません。

インターネットで解決策を見つけようとしましたが、さまざまな方法で文字列をデコードしましたが、常に同じ結果が得られました... XML は問題ありません base64 文字列を確認しましたが、問題ありません。コードもデバッグしましたが、base64 文字列を読み取っている var "fichero" の内容も問題ないことがわかったので、何が問題なのかわかりません。

これは私のコードです:

package prueba.sap.com;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

import sun.misc.BASE64Decoder;

import javax.xml.bind.DatatypeConverter;

public class anexoPO {


    public static void main(String[] args) throws Exception {
         FileInputStream inFile =
              new FileInputStream("C:/prueba/prueba_attach_b64.xml");
         FileOutputStream outFile =
              new FileOutputStream("C:/prueba/salida.pdf");      
         anexoPO myMapping = new anexoPO();
         myMapping.execute(inFile, outFile);
         System.out.println("Success");
         System.out.println(inFile);         

    }

    public void execute(InputStream in, OutputStream out)
     throws com.sap.aii.mapping.api.StreamTransformationException {

        try {       

          //************************Code To Generate The XML Parsing Objects*****************************//     
          DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
          DocumentBuilder db = dbf.newDocumentBuilder();
          Document doc = db.parse(in);
          Document docout = db.newDocument();

          NodeList CONTENIDO = doc.getElementsByTagName("CONTENIDO");
          String fichero = CONTENIDO.item(0).getChildNodes().item(0).getNodeValue();

          //************** decode *************/

              //import sun.misc.BASE64Decoder;
              //BASE64Decoder decoder = new BASE64Decoder();
              //byte[] decoded = decoder.decodeBuffer(fichero);

              //import org.apache.commons.codec.binary.*;
              //byte[] decoded = Base64.decode(fichero);

              //import javax.xml.bind.DatatypeConverter;
               byte[] decoded = DatatypeConverter.parseBase64Binary(fichero);

          //************** decode *************/

          String str = new String(decoded);
          out.write(str.getBytes());

          } catch (Exception e) {
               System.out.print("Problem parsing the file");
               e.printStackTrace();
              }       
    }

}

前もって感謝します。

4

1 に答える 1

2

絶対:

out.write(decoded);
out.close();

文字列はすべてのバイトを表すことはできず、PDF はバイナリです。

このパッケージはどこにも存在しないため、sun.misc.BASE64Decoder のインポートも削除します。コンパイラによって削除される可能性がありますが、私はそれに賭けません。

于 2013-02-12T09:41:51.913 に答える