从Java中的XML提取二进制数据

时间:2019-02-28 13:44:16

标签: java xml pdf httpresponse binaryfiles

我有一个来自SOAP Web服务的XML响应。此响应在特定标签内有一个二进制PDF,例如

<binaryObject>JVBERi0xLjQNCiVET0MxIFJlc2...</binaryObject>

我想提取二进制部分并将其转换回PDF文件。因此,我得到了将XML解析为org.w3c.Document并使用XPath的标签内容:

String binary = XMLUtils.evalXPath(doc, "//binaryObject//text()");

哪个工作正常,然后尝试执行以下操作:

        byte[] buffer = new byte[8 * 1024];
        // get the binary string as an array of bytes
        InputStream input = new ByteArrayInputStream(binary.getBytes("Cp1252"));
        int totalBytes = 0;
        try {

            OutputStream output = new FileOutputStream(PATHDOWNLOAD + File.separator + fileName);
            try {
                int bytesRead;
                while ((bytesRead = input.read(buffer)) != -1) {
                    output.write(buffer, 0, bytesRead);
                    totalBytes += bytesRead;
                }
            } finally {
                output.close();
            }
        } finally {
            input.close();
            logger.info("Done. " + totalBytes  + " bytes written.");
        }

它记下了文件,但是,它作为PDF不可读。尝试了各种编码,但仍然得到一个简单的文本文件,仅此而已。从文件到文本再到文件的翻译中可能丢失了一些东西,但是我无法想象使它起作用的方法。我被迫以String格式获取响应,因为我需要获取正确的标签,但随后我无法解码二进制部分。 有什么想法吗?

附录。如果我尝试登录以控制台二进制内容(当它仍然是String时),它将清除屏幕并根据执行情况从不同的位置打印出最后一部分。不知道能不能帮上忙。

1 个答案:

答案 0 :(得分:0)

您的binaryObject内容似乎已编码为base64,与字符编码无关(例如“ Cp1252”)。

Decode Base64 data in Java

甚至更适合您在使用流时使用的情况:

Stream decoding of Base64 data