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 を埋め込む方法を示すコードでは、( Readera にFileReader囲まれたBufferedReader) を使用してファイルを読み取り、1 行ずつ添付し、これらの行を\nセパレータとして使用して連結し、連結の結果を添付ファイルとして送信します。タイプ「application/pdf」のコンテンツ。

これは、テキスト ファイルの場合に検討する手順ですが (適切な選択ではありませんが)、このように読み取られたバイナリ ファイルは、ほとんどの場合、修復できないほど壊れてしまいます (PDFバイナリ ファイルです。それらをテキストとして扱うことはまったく無害であった歴史):

  • ファイルを読み取るとき、Readerはその中のバイトを何らかの文字エンコーディングに従って解釈し (ここでは明示的に指定されていないため、プラットフォームのデフォルトのエンコーディングが使用される可能性が最も高い)、 で収集された Unicode 文字に変換しますString。すでにここで、バイナリ データが破損している可能性が最も高いです。
  • を使用する場合、改行が認識されるreadLineまでこれらの Unicode 文字を読み取ります。行は、ライン フィード ('\n')、キャリッジ リターン ('\r')、またはキャリッジ リターンの直後のラインフィードのいずれかによって終了すると見なされます。(Java API ソース JavaDocs)。セパレータとしてこれらの行を均一に連結し続けると、基本的にすべての単一のキャリッジ リターン文字とすべてのキャリッジ リターン - ライン フィード文字のペアが単一のライン フィード文字に置き換えられ、バイナリ データがさらに損傷します。Reader\n
  • 使用する添付ファイル API でこの文字列を添付ファイル部分のコンテンツとしてエンコードすると、Unicode 文字がバイトに変換されます。たまたまリーダーが以前と同じ文字エンコーディングを想定した場合、当時受けたダメージの一部は修復されるかもしれませんが、すべてではありません。また、その間のステップの改行の解釈も修復されません。別のエンコーディングを使用すると、データが再び破損します。

したがって、AttachmentPart.setContent メソッドが受け入れるその他の引数を確認し、バイナリに損傷を与えないもの (InputStreams、ByteBuffers、byte[] など) を選択し、FileInputStream などを使用します。

SOAP メッセージから PDF を取得する方法を記述したコードはさらに奇妙です... 添付コンテンツの toString が何らかの意味のある文字列表現を返すと仮定し (ここではほとんどありません)、その文字列表現を含む新しい PDF を作成し続けます。 PDF の最初で唯一の段落のテキスト コンテンツとして。したがって、上記の添付ファイル作成コードは少なくとも「単に」PDF を損傷しましたが、添付ファイルの復元コードは添付ファイルの性質を完全に無視し、認識できないほど破壊します。

You should instead check the actual type of the content object, retrieve the binary data it holds according to its type, and store that content using a FileOutputStream (not a Writer, and not using Strings inbetween, and not copying 'line' by 'line').

And whatever source gave you the impression that your code was appropriate for the task... well, either you completely misunderstood it or you should shun it from now on.

于 2013-01-26T21:41:20.117 に答える