10

iTextSharp で pdf ファイルを作成しようとしています。私の試みでは、pdf のコンテンツを MemoryStream に書き込むので、結果をファイルとデータベース BLOB の両方に書き込むことができます。ファイルが作成され、サイズは約 21kB で、Notepad++ で開くと pdf のように見えます。しかし、私の PDF ビューアは、それが壊れていると言っています。以下に小さなコード スニペットを示します (データベースではなく、ファイルへの書き込みのみを試みます)。

Document myDocument = new Document();
MemoryStream myMemoryStream = new MemoryStream();
PdfWriter myPDFWriter = PdfWriter.GetInstance(myDocument, myMemoryStream);
myDocument.Open();
// Content of the pdf gets inserted here
using (FileStream fs = File.Create("D:\\...\\aTestFile.pdf"))
{
    myMemoryStream.WriteTo(fs);
}
myMemoryStream.Close();

私が犯した間違いはどこですか?

ありがとう、ノーバート

4

5 に答える 5

31

問題は、PDF にコンテンツを適切に追加していなかったことだと思います。これは Document.Add() メソッドを介して行われ、Document.Close() を呼び出して終了します。

ただし、Document.Close() を呼び出すと、MemoryStream も閉じられるため、FileStream に書き込むことはできません。これは、MemoryStream の内容をバイト配列に格納することで回避できます。

次のコードスニペットは私にとってはうまくいきます:

using (MemoryStream myMemoryStream = new MemoryStream()) {
    Document myDocument = new Document();
    PdfWriter myPDFWriter = PdfWriter.GetInstance(myDocument, myMemoryStream);

    myDocument.Open();

    // Add to content to your PDF here...
    myDocument.Add(new Paragraph("I hope this works for you."));

    // We're done adding stuff to our PDF.
    myDocument.Close();

    byte[] content = myMemoryStream.ToArray();

    // Write out PDF from memory stream.
    using (FileStream fs = File.Create("aTestFile.pdf")) {
        fs.Write(content, 0, (int)content.Length);
    }
}
于 2010-02-02T20:57:52.037 に答える
0

ちょっと考えてみてください-メモリストリームをファイルストリームに置き換えるとどうなりますか?これはあなたにあなたが必要とする結果を与えますか?これにより、少なくとも問題がどこにあるかがわかります。

これが機能する場合、ファイルはどのように異なりますか(サイズとバイナリ表現)?

推測ですが、書き込む前にメモリストリームの先頭を探してみましたか?

myMemoryStream.Seek(0, SeekOrigin.Begin);
于 2010-02-02T19:16:50.757 に答える
0

iText で PDF を操作するコードを再確認してみてください。PdfContentByte オブジェクトの適切な EndText メソッドを呼び出していることを確認し、ファイルをディスクに書き込む前に myDocument.Close() を呼び出していることを確認してください。これらは、iTextSharp で PDF を生成するときに過去に問題が発生したことです。

于 2010-02-02T19:20:30.730 に答える