我需要使用iText创建PDF文件。在第一页,页面顶部应该有一个标题,然后文档标题恰好位于剩余页面区域的中心(水平和垂直)。
Google搜索了很多,我发现的最佳解决方案是创建一个表并使用其单元格对齐方法。问题是:正确使用垂直对齐,我需要设置单元格的最小高度(cell.setMinimumHeight(...);)但我不知道剩余多少高度!使用带有一些硬编码偏移量的document.getPageSize()。getHeight()看起来不是一个好选择 - 我不想在我改变字体大小等时改变这个硬编码。
以下是页面顶部“标题”的代码,如果重要的话:
Paragraph preface = new Paragraph();
Paragraph o = new Paragraph("test", headerFont);
o.add(new LineSeparator(1, 100, Color.BLACK, Element.ALIGN_CENTER, -5));
preface.add(o);
o.add(new Paragraph(" "));
document.add(preface);
答案 0 :(得分:1)
好的,这是我到目前为止所得到的......
public static float getAvailableHeight(PdfDocument pdfDocument) {
Float indentBottom = pdfDocument.bottomMargin();
try {
Method method = pdfDocument.getClass().getDeclaredMethod("indentBottom");
method.setAccessible(true);
indentBottom = (Float) method.invoke(pdfDocument);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
float offset = pdfDocument.top() - pdfDocument.getVerticalPosition(false);
return pdfDocument.getPageSize().getHeight() - offset - pdfDocument.topMargin() - indentBottom
- pdfDocument.bottomMargin();
}
适合我。希望这会有助于其他人。
您需要访问封装在PdfWriter中的PdfDocument对象。我刚刚制作了自己的CustomPdfWriter,它扩展了PdfWriter。
需要带有反射的丑陋部分,因为方法indentBottom()是PdfDocument类中的包本地。