XML中Base64编码PDF字符串转PDF失败求助
问题分析与解决方案
你的转换失败核心原因很明确:你直接把整个XML文档的字节流拿去做Base64解码了,但实际上只有<Field>标签内部的内容才是PDF的Base64编码字符串。XML的标签、命名空间声明这些部分都不是Base64字符,直接解码肯定会抛出异常(但你的空catch块把异常吞了,导致你看不到错误信息)。
下面是具体的修复步骤和代码示例:
关键修复点
- 必须先解析XML,提取出
<Field>标签内的Base64纯字符串,再进行解码 - 不能依赖
inputstream.available()来获取全部字节,这个方法返回的是当前可读取的字节数,不是总长度 - 不要空catch异常,至少要记录或抛出异常,方便排查问题
修改后的代码示例(使用DOM解析处理命名空间)
import java.io.InputStream; import java.io.OutputStream; import java.util.Base64; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; public void transform(TransformationInput transformationInput, TransformationOutput transformationOutput) throws StreamTransformationException { try { InputStream inputStream = transformationInput.getInputPayload().getInputStream(); OutputStream outputStream = transformationOutput.getOutputPayload().getOutputStream(); // 1. 解析XML文档,处理命名空间 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); // 必须开启命名空间支持 DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(inputStream); // 2. 通过命名空间和标签名获取Field元素 NodeList fieldNodes = doc.getElementsByTagNameNS("urn:test.com:pdf", "Field"); if (fieldNodes.getLength() == 0) { throw new IllegalArgumentException("未找到包含Base64编码PDF的Field标签"); } // 3. 提取Field标签内的文本内容 Element fieldElement = (Element) fieldNodes.item(0); String base64Pdf = fieldElement.getTextContent().trim(); // 去除可能的空格换行 // 4. 解码Base64字符串并写入输出流 Base64.Decoder decoder = Base64.getDecoder(); byte[] pdfBytes = decoder.decode(base64Pdf); outputStream.write(pdfBytes); outputStream.flush(); } catch (Exception e) { // 不要吞掉异常,抛出或者记录日志 throw new StreamTransformationException("转换PDF失败: " + e.getMessage(), e); } }
额外注意事项
- 确保你的运行环境中包含XML解析的相关依赖(在SAP XI/PI环境中通常已经内置)
- 如果XML中的Base64字符串有换行或空格,
trim()或者提前清理一下可以避免解码错误 - 测试时可以先单独提取
<Field>内的字符串,用在线Base64解码工具验证是否能生成正常的PDF,排除源数据本身的问题
内容的提问来源于stack exchange,提问作者Shaibayan Chakrabarti
相关产品推荐
相关产品推荐

