我有一个XML文件,其中有一个名为“CONTENIDO”的节点,在这个节点中我有一个用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();
}
}
}
提前致谢。
答案 0 :(得分:2)
肯定:
out.write(decoded);
out.close();
字符串不能代表所有字节,PDF是二进制的。
同时删除sun.misc.BASE64Decoder的导入,因为此包不存在于任何地方。它可能会被编译器删除,但我不会赌它。