如何在所有页面上重复标题 - iText pdf

时间:2015-12-29 05:46:33

标签: java itext

我有一个标题表和一个内容表。我的内容表太长,不适合单个页面。所以我想在每页后重复我的标题表。我怎样才能做到这一点?请帮忙。

这是我的代码

File tempFile = File.createTempFile("progress", "tmp");
Document document = new Document(PageSize.A4);
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(tempFile));            
document.setMargins(6, 6, 36, 36);
document.setMarginMirroring(true);
document.open();
PdfPTable titleTable = new PdfPTable(new float[] { 18f });
// Image img = Image.getInstance(uploadFolder + "/logo.jpg");
Font titleFont = new Font(getBaseFont(), 12f, Font.BOLD);
Font tHeadFont = new Font(getBaseFont(), 10f, Font.BOLD);
Font contentFont = new Font(getBaseFont(), 10f);
// img.scalePercent(50);
titleTable.setWidthPercentage(100);
titleTable.getDefaultCell().setBorder(PdfPCell.NO_BORDER);
titleTable.getDefaultCell().setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
// titleTable.addCell(new Paragraph(new Chunk(img, 5, -5)));
document.add(gutter());
titleTable.addCell(new Paragraph("Title", titleFont));         
document.add(titleTable);
document.add(gutter());
document.add(gutter());

PdfPTable comTable = new PdfPTable(new float[] { 6f, 4f, 2f, 3f, 6f, 3f });
PdfPCell cell1 = new PdfPCell(new Paragraph("Module", tHeadFont));
cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell1.setPaddingBottom(4);
comTable.addCell(cell1);
PdfPCell cell2 = new PdfPCell(new Paragraph("Name", tHeadFont));
cell2.setHorizontalAlignment(Element.ALIGN_CENTER);
cell2.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell2.setPaddingBottom(4);
comTable.addCell(cell2);
PdfPCell cell3 = new PdfPCell(new Paragraph("Serial", tHeadFont));
cell3.setHorizontalAlignment(Element.ALIGN_CENTER);
cell3.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell3.setPaddingBottom(4);
comTable.addCell(cell3);
PdfPCell cell4 = new PdfPCell(new Paragraph("Lesson", tHeadFont));
cell4.setHorizontalAlignment(Element.ALIGN_CENTER);
cell4.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell4.setPaddingBottom(4);
comTable.addCell(cell4);
PdfPCell cell5 = new PdfPCell(new Paragraph("Topic", tHeadFont));
cell5.setHorizontalAlignment(Element.ALIGN_CENTER);
cell5.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell5.setPaddingBottom(4);
comTable.addCell(cell5);
PdfPCell cell6 = new PdfPCell(new Paragraph("No.of Lessons", tHeadFont));
cell6.setHorizontalAlignment(Element.ALIGN_CENTER);
cell6.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell6.setPaddingBottom(4);
comTable.addCell(cell6);

下面有一些迭代用于显示动态的内容,所以我不知道会有多少页面。 我想在所有页面上重复titleTable。

1 个答案:

答案 0 :(得分:2)

您有不同的选择。

方法#1:定义表格的标题行

您可以使用单个表并定义一个或多个标题行,而不是使用两个表。在以下问题的答案中解释了这一点:

您还可以从以下示例中获得灵感:

方法#2:定义页面标题

正如您在StackOverflow上浏览其他问题时所发现的那样,您可以使用页面事件来创建标题。不到一天前,我在这里解释了基本原则:Header and Footer in ITextSharp

有关更多示例,请参阅:

但你真正想要的是问题的答案:

简而言之,您需要这样的页面事件:

public class FooterTable extends PdfPageEventHelper {
    protected PdfPTable footer;
    public FooterTable(PdfPTable footer) {
        this.footer = footer;
    }
    public void onEndPage(PdfWriter writer, Document document) {
        footer.writeSelectedRows(0, -1, 36, 64, writer.getDirectContent());
    }
}

但是,您应该调用此类FooterTable而不是使用硬编码坐标代替HeaderTable,而应使用以下内容:

float x = document.left(36);
float y = document.top(10);
footer.writeSelectedRows(0, -1, x, y, writer.getDirectContent());

在定义xy时,我使用document对象作为只读对象来获取边距为36的左边坐标和顶部坐标为a保证值为50很重要的是要知道10的余量可能是表空间不足:标题表可能会遇到内容表。如果是这种情况,则需要计算标题表的高度并更改文档的上边距,以使标题表和内容表不重叠。

我有一个问题要问:我们重新设计了iText网站,并在感恩节发布了它。我们现在注意到,我们没有像以前那样多次访问。鉴于您需要的所有信息都可以在在线文档中找到,并且鉴于您仍然需要提出问题这一事实,我们想知道该网站有什么问题。我们可以做些什么来改善内容吗?为了找到问题的答案,我使用了搜索框和标签,例如header。可能是什么原因导致人们远离我们的网站?我们现在有太多内容吗?