我已经制作了一个解决方案(JAVA 和 iText)来从页眉和页脚的 html 渲染处理生成 PDF。
我正在使用 iText 5.5.9 和 java 1.7.
用户将能够选择是否应在每个页面上重复标题,这是在用户选择具有标记的 html 模板时发生的,该标记表明它可以或不能重复标题
我遇到的问题是关于页面上内容的最高边缘。
第一页上总会有标题,所以我创建了带有上边距的文档,其中包含我需要的值:
document = new Document(PageSize.A4, 85.35826771653F, 56.90551181102F, 140, 130.90551181102F);
- 情况 1(没关系)
当 html 有分页符时,我可以将顶部更改为文本以进一步增加:
for (Element e : this.pdfProcessor.parseToElementList(pageHTML, null)) {
document.add(e);
if (pageline == 0 && this.modeloTemplateMPF) {
if (this.headerNoLoop) {
document.setMargins(85.35826771653F, 56.90551181102F, 60F, 130.90551181102F);
} else {
document.setMargins(85.35826771653F, 56.90551181102F, 140F, 130.90551181102F);
}
}
}
方法 parseToElementList:
public ElementList parseToElementList(String html, String css) throws Exception {
ElementList elements = null;
try {
// CSS
CSSResolver cssResolver = new StyleAttrCSSResolver();
if (css != null) {
CssFile cssFile = XMLWorkerHelper.getCSS(new ByteArrayInputStream(css.getBytes()));
cssResolver.addCss(cssFile);
}
// HTML
CssAppliers cssAppliers = new CssAppliersImpl(FontFactory.getFontImp());
HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);
htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
htmlContext.setImageProvider(this.base64ImageProvider);
// Pipelines
elements = new ElementList();
ElementHandlerPipeline end = new ElementHandlerPipeline(elements, null);
HtmlPipeline htmlPipeline = new HtmlPipeline(htmlContext, end);
CssResolverPipeline cssPipeline = new CssResolverPipeline(cssResolver, htmlPipeline);
// XML Worker
XMLWorker worker = new XMLWorker(cssPipeline, true);
XMLParser p = new XMLParser(worker);
p.parse(new ByteArrayInputStream(html.getBytes()));
} catch (Exception e) {
throw e;
}
return elements;
}
- 情况 2(没关系)
如果我在每个页面都有标题,我将没有问题。
- 情况 3(不行)
但是当 html 没有分页符时,iText 本身会执行分页符,但 TOP 边距始终保持与创建文档时定义的相同。在这种情况下,值为 140。
在没有分页符的情况下,如何让 iText 考虑更改第二页的上边距?