如何使用Java iText 5.5.x使用页面上的y位置向文档添加分页符?我已经重写了Div类以使用自定义HTML标记,该标记表示要保留在一起的内容(因为一致性列表[http://demo.itextsupport.com/xmlworker/itextdoc/CSS-conformance-list.htm]表示HTML中的分页符必须是“始终”)。当内容大于我想要的页面大小时,我似乎无法确定如何打破。 PDF生成不使用创建PDF的“标准”方式,但通过解析HTML文件获取内容。
以下是我对Div课程的看法:
class PageBreak extends Div {
private Document document;
private PdfWriter writer;
private float breakPoint;
private float signatureArea = 80;
public PageBreak(Document document, PdfWriter writer) {
this.document = document;
this.writer = writer;
this.breakPoint = (document.top() - signatureArea - 40 /*padding*/);
}
@Override
public List<com.itextpdf.text.Element> end(WorkerContext ctx, Tag tag, List<com.itextpdf.text.Element> currentContent) {
System.out.println("END POS: " + writer.getVerticalPosition(true));
System.out.println("writer.getVerticalPosition(true) " + writer.getVerticalPosition(true));
System.out.println("breakPoint: " + breakPoint);
boolean newPage = writer.getVerticalPosition(true) > breakPoint;
if(newPage) {
System.out.println("breaking");
document.newPage();
}
return currentContent;
}
@Override
public List<com.itextpdf.text.Element> start(WorkerContext ctx, Tag tag) {
System.out.println("START POS: " + writer.getVerticalPosition(true));
System.out.println("writer.getVerticalPosition(true) " + writer.getVerticalPosition(true));
System.out.println("breakPoint: " + breakPoint);
return new ArrayList<com.itextpdf.text.Element>(0);
}}
HTML的一个例子:
<pagebreak>
<table><tr><td class="section-h3">A table</td></tr></table>
<table>
<tr>
<td class="withback-70">Reviewed By</td>
<td class="withoutback-70">Jim</td>
</tr>
</table>
</pagebreak>
这是将HTML转换/解析为PDF的代码:
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, outputStream);
writer.setPageEvent(new HeaderFooter(mappedMasterIncident));
document.setPageSize(PageSize.LETTER);
document.setMargins(18, 18, 18, 95);
document.open();
HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
//not working
//TagProcessorFactory factory = Tags.getHtmlTagProcessorFactory();
//factory.addProcessor(new PageBreak(document, writer), "pagebreak");
//htmlContext.setTagFactory(factory);
htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
htmlContext.setImageProvider(new Base64ImageProvider());
CSSResolver cssResolver = new StyleAttrCSSResolver();
cssResolver.addCssFile("file:///C|/Users/jim.willmore/Desktop/pdf.css", true);
Pipeline<?> pipeline = new CssResolverPipeline(cssResolver,new HtmlPipeline(htmlContext, new PdfWriterPipeline(document, writer)));
XMLWorker worker = new XMLWorker(pipeline, true);
XMLParser p = new XMLParser( worker);
p.parse(templateReader);
document.close();