java - java代码中的PDF生成问题

标签 java pdf soap

我在 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();
}

谁能帮帮我吗?

最佳答案

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

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

对于文本文件,您可以考虑这个过程(尽管这也不是一个好的选择),但是二进制文件像这样读取,很可能会损坏而无法修复(并且 PDF 二进制文件)文件,尽管在其历史的早期阶段将它们作为文本处理是相当无害的):

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

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

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

您应该检查内容对象的实际类型,根据其类型检索它所保存的二进制数据,并使用 FileOutputStream (不是 Writer,并且不在中间使用字符串,并且不复制“行”)存储该内容按“线”)。

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

关于java - java代码中的PDF生成问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14534575/

相关文章:

java - 如何持久保存引用的 RealmObject

java - Java 8 中包含夏令时的期间的 period. Between (四舍五入日)

java - 奇怪的 setRowspan 错误/不起作用

php - Webhook 使用 Woocommerce 产品详细信息触发计费程序中的产品插入

java - 字节码中丢失变量 'final' 修饰符?

java - 策略模式在什么情况下会失效转移继承

iphone - 在 iOS 上生成 PDF 时定位元素

iOS PDF 编辑——结合 FastPDFKit/CGPDFContext 和 libHaru

c# - 将 ServiceDescription 代码移植到 .net Core

soap - 在 SOAP 中向现有输出数据类型添加新字段的变通方法