我是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页面中),因此我无法以这种方式实现。
如果您能帮助我,请先谢谢。
答案 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;