使用canvasrenderer时如何管理itext 7中的溢出数据

How to manage the overflow data in itext 7 when using canvasrenderer

我正在使用 iText 7 从保存在数据库中的 html 文件生成 pdf 文件。

我使用以下代码生成 pdf,但忽略了 html 文件中 table 的一半。我猜 IBlockElement 包含 table 的大小大于 canvas.

的大小

有解决问题的想法吗?

List<IElement> elements = (List<IElement>)HtmlConverter.ConvertToElements(html);   
for (int k = 0; k < elements.Count; k++)
    {

        if (!renderer.IsFull())
        {
            canvas.Add((IBlockElement)elements[k]);
        }
        else
        {
            page = pdfDoc.AddNewPage();
            pdfCanvas = new PdfCanvas(page.NewContentStreamBefore(), page.GetResources(),pdfDoc);
            rectangle = new Rectangle(offset, offset, pageWidth, pageHeight);
            pdfCanvas.Rectangle(rectangle);
            pdfCanvas.Stroke();
            canvas = new iText.Layout.Canvas(pdfCanvas, pdfDoc, rectangle);
            renderer = new MyCanvasRenderer(canvas);
            canvas.SetRenderer(renderer);
        }
    }

实施MyCanvasRenderer

class MyCanvasRenderer : CanvasRenderer {
    protected bool full = false;

    public MyCanvasRenderer(Canvas canvas) : base(canvas) {
    }

    public override void AddChild(IRenderer renderer) {
        base.AddChild(renderer);
        full = true.Equals(GetPropertyAsBoolean(Property.FULL));
    }

    public bool IsFull() {
        return full;
    }
}

Canvas class 主要针对需要将元素添加到页面/XObject 上的特定预定义区域的情况,而不是将内容溢出到下一个区域。

由于所描述的用例只是将 HTML 转换为 PDF,因此要使用的适当 API 是 HtmlConverter 的另一种方法,它允许您将 HTMLPDF 在一行中:

HtmlConverter.ConvertToPdf(html, pdfWriter);

UPD:@Saeed

对额外要求的说明

首页页边距不同

CSS 允许您使用 @page 媒体指定页边距,这些声明由 pdfHTML 选取。以下是页边距规范的示例以及如何为第一页自定义它们:

@page {
    margin-top: 100pt;
    margin-left: 36pt;
    margin-right: 36pt;
    margin-bottom: 36pt;
}

@page:first {
    margin-top: 100pt;
    margin-left: 36pt;
    margin-right: 36pt;
    margin-bottom: 36pt;
}

避免将 table 拆分成多个页面

CSS 有 page-break-inside 属性 控制元素的页面外观。特别是,您对防止元素跨页拆分的 page-break-inside: avoid; 声明感兴趣。

您可以将此声明应用于文档中的所有 table:

table {
    page-break-inside: avoid;
}

或者,您可以创建自己的 class 并仅在必要时应用它:

.avoid-page-breaks {
    page-break-inside: avoid;
}

<table class="avoid-page-breaks">
...
</table>

第三个选项是将此样式应用于 table 内联:

<table style="page-break-inside: avoid;">
...
</table>