1

iTextSharpを使用してMVCでPDFファイルを作成しようとしています。私は次の簡単な使用例を持っています。ファイルは作成されていますが、PDFを開くと、エラーファイルが破損してファイルを開くことができません。何かアイデア/ヘルプ?

私のコントローラーコードは次のとおりです

public FileStreamResult GetPdfMemory()
{
            iTextSharp.text.Document doc = new iTextSharp.text.Document();


            MemoryStream mem = new MemoryStream();
            PdfWriter pdfWriter = PdfWriter.GetInstance(doc, mem);
            //pdfWriter.CloseStream = false;

            doc.Open();
            doc.Add(new Paragraph("Charts"));


            mem.Position = 0;

            FileStreamResult fileStreamResult = new FileStreamResult(mem, System.Net.Mime.MediaTypeNames.Application.Pdf)
            {
                FileDownloadName = "chart_" + ".PDF"
            };

            return fileStreamResult;
}

ビュー:@ Html.ActionLink( "Pdf Memory"、 "GetPdfMemory"、 "Home"、null、new {id = "download"})

参考:MemoryStreamの代わりにFileStreamを使用しようとすると、すべて正常に機能します。しかし、メモリストリームを使用してPDFを作成する必要があります。

4

1 に答える 1

0

ドキュメントをファイナライズできることを iTextSharp に通知する前に、( ) を操作して ( mem.Position = 0) を使用します。したがって、メモリ ストリーム内のおよび の暗黙的な破棄またはデータの使用が最初に行われるかどうかに応じて、PDF の終了部分が失われるか、終了部分 (メモリ ストリームの位置を変更した後に書き込まれる) が開始を上書きします。データの。new FileStreamResult(mem, ...)MemoryStreamDocumentPdfWriter

ドキュメントをファイナライズできることを iTextSharp に通知するにはdoc.Close()、メモリ ストリームを操作する前に呼び出すかDocumentusingブロック内で を使用してください。

using (MemoryStream ms = new MemoryStream()) {
  // step 1
  using (Document document = new Document()) {
    // step 2
    PdfWriter.GetInstance(document, ms);
    // step 3
    document.Open();
    // step 4
    document.Add(new Paragraph("HelloWorldMemory"));      
  }
  HttpContext.Current.Response.BinaryWrite(ms.ToArray());
}

( Webified iTextSharp ExamplesのサンプルHelloWorldMemory.csから恥知らずにコピー) iText in Action — 2nd Edition )

usingを暗黙的に使用すると、Documentが閉じられます。

于 2013-02-20T08:11:04.970 に答える