如何在C#中使用iText7在PDF中生成多页表格?

问题描述 投票:0回答:1

我正在尝试使用 C# 中的 iText7 生成一个包含跨多个页面的表格的 PDF。但是,我遇到了一个错误:“PdfPages 树只能生成一次。”

这是我的代码的简化版本:

using (var templateReader = new PdfReader(_env.ContentRootPath + "\\templates\\" + single.Tipo + ".pdf"))
using (var templateDoc = new PdfDocument(templateReader))
{

    PdfPage templatePage = templateDoc.GetPage(1);
    PdfFormXObject templateXObject = templatePage.CopyAsFormXObject(pdfDoc);

    canvas.BeginText();
    canvas.MoveText(120, 664);
    canvas.ShowText($"{single.Numero} / {single.Data.Year.ToString()}");
    canvas.EndText();

    canvas.BeginText();
    canvas.MoveText(40, 756);
    canvas.ShowText(single.Data.ToString("dd/MM/yyyy"));
    canvas.EndText();

    canvas.BeginText();
    canvas.MoveText(500, 800);
    canvas.ShowText("ID#" + single.Id.ToString());
    canvas.EndText();

    Table table1 = new Table(1).SetWidth(526);
    var righe = single.Righe.ToList();
    AddPreventivoTable(table1, righe);

    float rectHeight = 595;
    var altezzaRighe = CalculateRowHeights(table1);
    var table1Height = altezzaRighe.Sum();
    int pageCount = (int)Math.Ceiling(table1Height / rectHeight);


    for (int i = 0; i < pageCount; i++)
    {
        if (i > 0)
        {
            pdfDoc.AddNewPage();
            var page = pdfDoc.GetPage(i + 1);
            canvas = new PdfCanvas(page.NewContentStreamBefore(), page.GetResources(), pdfDoc);
            var bf = PdfFontFactory.CreateFont(StandardFonts.HELVETICA);
            canvas.SetFontAndSize(bf, 10);
            canvas.SetColor(ColorConstants.BLACK, true);
            canvas.AddXObject(templateXObject);
            AddIntestazione(canvas, ana);

            canvas.BeginText();
            canvas.SetTextMatrix(120, 664);
            canvas.ShowText($"{single.Numero} / {single.Data.Year.ToString()}");
            canvas.EndText();

            canvas.BeginText();
            canvas.SetTextMatrix(40, 756);
            canvas.ShowText(single.Data.ToString("dd/MM/yyyy"));
            canvas.EndText();

            canvas.BeginText();
            canvas.SetTextMatrix(500, 800);
            canvas.ShowText("ID#" + single.Id.ToString());
            canvas.EndText();

        }

        Rectangle rect1 = new iText.Kernel.Geom.Rectangle(34, 60, 526, rectHeight);
        var canvasRect1 = new Canvas(canvas, rect1);
        Table subTable = new Table(1).SetWidth(526);
        float currentHeight = 0;
        int currentRow = 0;
        while (currentRow < table1.GetNumberOfRows())
        {
            float cellHeight = altezzaRighe[currentRow];
            if (currentHeight + cellHeight > rectHeight)
            {
                break;
            }
            var cell = table1.GetCell(currentRow, 0).Clone(true);
            subTable.AddCell(cell);
            currentHeight += cellHeight;
            currentRow++;
        }


        canvasRect1.Add(subTable);
        canvasRect1.SetBorder(new SolidBorder(ColorConstants.LIGHT_GRAY, 0.5f));
        canvas.Stroke();
        canvasRect1.Close();
    }
}`

当我用包含段落的简单单元格替换单元格创建时,不会出现错误。但是,我需要从原始表格单元格复制内容,其中可能包括嵌套表格和其他元素。

如何正确复制原始单元格的内容并将其添加到新表格中而不会遇到此错误?任何帮助或建议将不胜感激!

c# itext7
1个回答
0
投票

我刚刚遇到了类似的问题。

我的代码更简单。我只是想阅读该文档并关闭它。

using PdfDocument pdfDoc = new(pdfReader, pdfWriter);
pdfDoc.Close();

我尝试在网上查找更多信息,但不幸的是,除了您提到的错误之外,我找不到任何其他详细信息。

然后,我询问神经网络,它为我提供了这个解决方案:

using PdfDocument pdfDoc = new(pdfReader, pdfWriter, new StampingProperties().UseAppendMode());
pdfDoc.Close();

神经网络给出了以下解释:

StampingProperties().UseAppendMode()
- 允许您进行更改 现有的 PDF,而不是从头开始重建它。这消除了 需要重新创建页面树,这有助于防止错误。

它对我有帮助,我想与其他人分享。

© www.soinside.com 2019 - 2024. All rights reserved.