使用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
的另一种方法,它允许您将 HTML
到 PDF
在一行中:
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>
我正在使用 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
的另一种方法,它允许您将 HTML
到 PDF
在一行中:
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>