0

我在 Soap 响应消息中收到一个 PDF 附件。我需要从中生成一个 PDF。但是,生成的 PDF 格式如下:

%PDF-1.4
%
2 0 obj
<</Type/XObject/ColorSpace/DeviceRGB/Subtype/Image/BitsPerComponent 8/Width
278/Length 7735/Height 62/Filter/DCTDecode>>stream

我该如何解决这个问题?

这是显示我如何将 PDF 作为附件嵌入的代码:

message = messageFactory.createMessage();
SOAPBody body = message.getSOAPBody();
header.detachNode();
AttachmentPart attachment1 = message.createAttachmentPart();
fr = new FileReader(new File(pathName));
br = new BufferedReader(fr);
String stringContent = "";
line = br.readLine();
while (line != null) {
    stringContent = stringContent.concat(line);
    stringContent = stringContent.concat("\n");
    line = br.readLine();
}
fr.close();
br.close();
attachment1.setMimeHeader("Content-Type", "application/pdf");
attachment1.setContent(stringContent, "application/pdf"); 

下面的代码描述了我如何从 SOAP 消息中获取 PDF:

Object content = attachment1.getContent();
writePdf(content);

private void writePdf(Object content) throws IOException, PrintException,
        DocumentException {
    String str = content.toString();
    //byte[] b = Base64.decode(str);
    //byteArrayToFile(b);
    OutputStream file = new FileOutputStream(new File
            (AppConfig.getInstance().getConfigValue("webapp.root") +
            File.separator + "temp" + File.separator + "hede.pdf"));
    //String s2 = new String(bytes, "UTF-8");
    //System.out.println("S2::::::::::"+s2);
    Document document = new Document();
    PdfWriter.getInstance(document, file);

    document.open();
    document.add(new Paragraph(str));
    document.close();
    file.close();
}

谁能帮我吗?

4

1 回答 1

1

提供的代码中有几个错误:

显示如何将 pdf 作为附件嵌入的代码中,您使用 a Reader(包含FileReader在 a 中BufferedReader)读取文件以逐行附加,将这些行与 using\n作为分隔符连接起来,并将连接的结果作为附件发送“应用程序/pdf”类型的内容。

这是您可以考虑用于文本文件的过程(即使它在那里也不是一个好的选择),但是像这样读取的二进制文件最有可能被破坏而无法修复(并且 PDF二进制文件,尽管它们处于早期阶段将它们作为文本处理的历史是非常无害的):

  • 读取文件时,aReader根据某种字符编码解释其中的字节(因为这里没有明确给出,很可能使用平台默认编码)将它们转换为收集在 a 中的 Unicode 字符String。已经在这里很可能二进制数据已损坏。
  • 使用时,readLine您会阅读这些 Unicode 字符,直到Reader识别出换行符。一行被认为是由换行符 ('\n')、回车符 ('\r') 或紧跟换行符的回车符中的任何一个终止的。(Java API 源 JavaDocs)。当您继续使用\n作为分隔符统一连接这些行时,您实际上将所有单个回车符和所有回车 - 换行符对替换为单个换行符,从而进一步损坏二进制数据。
  • 当您制作附件 API 时,您使用将此字符串编码为某些附件部分的内容,使其将您的 Unicode 字符转换回字节。如果偶然假设与 Reader 之前相同的字符编码,这可能会治愈当时造成的一些损害,但肯定不是全部,并且中间步骤的换行解释当然也没有治愈。如果使用不同的编码,数据会再次损坏。

因此,请检查您的 AttachmentPart.setContent 方法接受哪些其他参数,选择不会损坏二进制文件的参数(例如 InputStreams、ByteBuffers、byte[]、...)并使用它,例如 FileInputStream。

描述如何从 SOAP 消息中获取 PDF的代码甚至更奇怪......您假设附件内容的 toString 返回一些有意义的字符串表示(这里不太可能),然后继续创建一个包含该字符串表示的新 PDF作为 PDF 的第一段也是唯一一段的文本内容。因此,虽然您上面讨论的附件创建代码至少“仅”损坏了 PDF,但您的附件检索代码完全忽略了附件的性质并将其破坏得面目全非。

相反,您应该检查内容对象的实际类型,根据其类型检索它保存的二进制数据,并使用 FileOutputStream 存储该内容(不是 Writer,并且不使用其间的字符串,并且不通过 'line' 复制 'line' ')。

无论来源给您的印象是您的代码适合该任务......好吧,要么您完全误解了它,要么您应该从现在开始避开它。

于 2013-01-26T21:41:20.117 回答