iText 7 pdhHtml将表行保持在一起

时间:2018-10-14 09:02:46

标签: itext7

我是iText 7的新手,我正在开发一个spa项目(asp.net,c#和angularjs),在这里我需要为现有的html页面实现一个报告。我发现iText 7(.Net)有一个简单的方法实现它的方式。使用下面的代码行,这将返回一个字节数组,我可以轻松地在浏览器中显示pdf,也可以下载。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    short int n,x;
    scanf("%d",&n);
    scanf("%d",&x);
    printf("%d %d",n,x);
    return 0;
}

在我的原始html中有一些html表(每个表都有一些特定的行),我想将它们保留在页面中(我的意思是如果表的行不适合单个页面,则从下一页开始)。我有以下解决方案

var memStream = new MemoryStream();
ConverterProperties converterProperties = new ConverterProperties();
converterProperties.SetFontProvider(fontProvider);              converterProperties.SetBaseUri(System.AppDomain.CurrentDomain.BaseDirectory);
HtmlConverter.ConvertToPdf(htmlText, memStream, converterProperties);

但是在我的情况下,由于内容已经存在于html表中(在我现有的html页面中),因此我无法以这种方式实现。

如果您能帮助我,请先谢谢。

2 个答案:

答案 0 :(得分:3)

使用自定义的 TagWorkerFactory TableTagWorker 类可以轻松完成此操作。 看看下面的代码示例。

我们应该做的第一件事是创建一个自定义TableTagWorker,它告诉iText将表保持在一起。我们使用您提到的代码 table.setKeepTogether(true)

class CustomTableTagWorker extends TableTagWorker{

    public CustomTableTagWorker(IElementNode element, ProcessorContext context) {
        super(element, context);
    }

    @Override
    public void processEnd(IElementNode element, ProcessorContext context) {
        super.processEnd(element, context);
        ((com.itextpdf.layout.element.Table) getElementResult()).setKeepTogether(true);
    }
}

您可以看到,我们对自定义TableTagWorker所做的唯一更改是必须将表保持在一起。

下一步是创建一个自定义的 TagWorkerFactory ,它将我们的 CustomTableTagWorker 映射到HTML中的 table 标记。我们这样做是这样的:

class CustomTagWorkerFactory extends DefaultTagWorkerFactory{
    @Override
    public ITagWorker getCustomTagWorker(IElementNode tag, ProcessorContext context) {
        if (tag.name().equalsIgnoreCase("table")) {
            return new CustomTableTagWorker(tag, context); // implements ITagWorker
        }
        return super.getCustomTagWorker(tag, context);
    }
}

我们在这里所做的就是告诉iText,如果找到 table 标签,则应将元素传递给 CustomTableTagWorker ,以便将其转换为PDF对象(其中setKeepTogether == true)。

最后一步是在我们的 ConverterProperties 中注册此 CustomTagWorkerFactory

ConverterProperties converterProperties = new ConverterProperties();
converterProperties.setTagWorkerFactory(new CustomTagWorkerFactory());
HtmlConverter.convertToPdf(HTML, new FileOutputStream(DEST), converterProperties);

使用这些代码示例,我能够生成一个输出PDF,其中的表如果足够小,可以在整个页面上呈现,则永远不会拆分成多个页面。

答案 1 :(得分:0)

我有一个类似的问题,试图将div中的内容保持在一起。我应用了以下css属性,并将所有内容组合在一起。这适用于itext7 pdfhtml。

page-break-inside: avoid;