2

単一の PdfTable で構成される ITextSharp を使用して PDF を作成しています。残念なことに、特定のデータ セットでは、作成された多数の PdfPCells が原因でメモリ不足の例外が発生しています (メモリ使用量をプロファイリングしました - 100 万セルのほぼ 1/2 を取得しました!)

このような場合にメモリ使用量を減らす方法はありますか? さまざまなポイント(各行の後)でフラッシュし、完全に圧縮しようとしました

PdfWriter は FileStream に基づいています

コードは次のようになります。

Document document = Document();
FileStream stream = new FileStream(fileName,FileMode.Create);                                   
pdfWriter = PdfWriter.GetInstance(document, stream);
document.Open();
PdfPTable table = new PdfPTable(nbColumnToDisplay);
foreach (GridViewRow row in gridView.Rows)
{
    j = 0;
    for (int i = 0; i < gridView.HeaderRow.Cells.Count; i++)
    {
        PdfPCell cell = new PdfPCell( new Phrase( text) );
        table.AddCell(cell);
    }   
}
document.Add(table);
document.Close();
4

2 に答える 2

5

iTextSharp にはILargeElementPdfPTable実装と呼ばれる非常にクールなインターフェイスがあります。ドキュメントによると:

/**
* Interface implemented by Element objects that can potentially consume
* a lot of memory. Objects implementing the LargeElement interface can
* be added to a Document more than once. If you have invoked setCompleted(false),
* they will be added partially and the content that was added will be
* removed until you've invoked setCompleted(true);
* @since   iText 2.0.8
*/

したがって、必要なことは、 を作成した後、プロパティを falsePdfPTableに設定することだけです。Complete内部ループで、時々テーブルを追加してメモリをクリアする何らかの形式のカウンターを実行します。次に、ループの最後でCompletetrue に設定し、もう一度追加します。

以下は、これを示すサンプル コードです。カウンター チェックを行わないと、このコードは私のマシンで約 500MB の RAM を使用します。1,000 項目ごとにカウンター チェックを行うと、RAM が 16 MB に減少します。カウンターの独自のスイート スポットを見つける必要があります。それは、平均して各セルに追加するテキストの量によって異なります。

string fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "table.pdf");
Document document = new Document();
FileStream stream = new FileStream(fileName, FileMode.Create);
var pdfWriter = PdfWriter.GetInstance(document, stream);
document.Open();

PdfPTable table = new PdfPTable(4);
table.Complete = false;
for (int i = 0; i < 1000000; i++) {
    PdfPCell cell = new PdfPCell(new Phrase(i.ToString()));
    table.AddCell(cell);
    if (i > 0 && i % 1000 == 0) {
        Console.WriteLine(i);
        document.Add(table);
    }
}
table.Complete = true;
document.Add(table);
document.Close();
于 2013-03-18T17:54:23.763 に答える
0

PdfPTable pdftbale = new PdfPTable(gridview.HeaderRow.Cells.Count);

    foreach (TableCell tabhead in gridview.HeaderRow.Cells)
    {
        PdfPCell pdfcell1 = new PdfPCell(new Phrase(tabhead.Text));
        pdftbale.AddCell(pdfcell1);
    }

    foreach (GridViewRow gd in gridview.Rows)
    {
        foreach (TableCell tab in gd.Cells)
        {
            PdfPCell pdfcell = new PdfPCell(new Phrase(tab.Text));
            pdftbale.AddCell(pdfcell);
        }
    }

    iTextSharp.text.Document pdfDocument = new iTextSharp.text.Document(PageSize.A4, 10f, 10f, 10f, 10f);
    PdfWriter.GetInstance(pdfDocument, new FileStream(Server.MapPath("~/pdf/" + DateTime.Now.ToString("ddMMyyyyhhmmss") + ".pdf"), FileMode.Create));
    pdfDocument.Open();
    pdfDocument.Add(pdftbale);
    pdfDocument.Close();
于 2016-04-27T09:06:09.730 に答える