使用 iText 5 时出现奇怪的显示问题
Weird Display issue using iText 5
我很确定我的问题最简单的答案是 "You need to update your version of iText." 但是,我的老板在从 iText 4 更新到 iText 5 后不愿意更新,正如他所说,"Broke so much crap." 所以我使用 iText 5.0.1 来构建这个 PDF。
我正在构建一个应用程序,它将读取 Excel 文件并为我们参加的活动创建徽章。它相当简单,一切都按预期工作,除了最终结果的样子。
我设置 PDF 的方式(代码将在下面显示)是每个徽章都印有正面和背面(我们双面打印),并且每个页面本身应该包含 6 个徽章。当我通过在每次销售中复制相同的徽章来测试它时,它看起来不错。但是当我使用一组数据时,无论出于何种原因,我的 PDF 都会被丢弃。它不是每页 6 个徽章,而是有时 每页打印 6 个,其他时候每页打印 3 个。例如,我的 excel 文件有 21 行数据 - 要创建 21 个徽章。我每页有 3 组 3 个徽章,每页有 2 组 6 个徽章,分别设置为 3、6、6、3,分别对应每页上的徽章数量。
我是否遗漏了 3 页,每页 6 个徽章,然后一页只有 3 个徽章?
Document document = new Document(PageSize.LETTER, MARGIN, MARGIN, MARGIN, MARGIN);
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename));
document.open();
PdfContentByte cb = writer.getDirectContent();
buildDocument(document, badgeFronts, badgeBacks);
document.close();
public void buildDocument(Document document, ArrayList<PdfPTable> badgeFronts, ArrayList<PdfPTable> badgeBacks) throws DocumentException{
float[] frontTableWidths = {150f, 10f, 150f, 10f, 150f, 10f};
float[] backTableWidths = {10f, 150f, 10f, 150f, 10f, 150f};
PdfPTable frontTable = new PdfPTable(6);
frontTable.setWidths(frontTableWidths);
frontTable.setWidthPercentage(100);
PdfPTable backTable = new PdfPTable(6);
backTable.setWidths(backTableWidths);
backTable.setWidthPercentage(100);
int count = 0;
for(int i = 0; i < badgeFronts.size(); i++){
PdfPCell frontCell = new PdfPCell();
frontCell.setFixedHeight(260f);
frontCell.setBorderColor(BaseColor.GRAY);
PdfPCell backCell = new PdfPCell();
backCell.setFixedHeight(260f);
backCell.setBorderColor(BaseColor.GRAY);
if(count == 5){
count = 0;
document.add(frontTable);
document.newPage();
document.add(backTable);
document.newPage();
frontTable.deleteBodyRows();
backTable.deleteBodyRows();
}
PdfPTable front = badgeFronts.get(i);
PdfPTable back = badgeBacks.get(i);
frontCell.addElement(front);
backCell.addElement(back);
frontTable.addCell(frontCell);
frontTable.addCell("");
backTable.addCell("");
backTable.addCell(backCell);
if(i == badgeFronts.size() - 1){
document.add(frontTable);
document.newPage();
document.add(backTable);
document.newPage();
}
count++;
}
frontTable.completeRow();
backTable.completeRow();
}
以上是我的代码。我在其他地方的主要 table 单元格中创建了表格,并且可以在需要时显示它,但我认为没有必要。
if(count == 5){
count = 0;
document.add(frontTable);
document.newPage();
document.add(backTable);
document.newPage();
frontTable.deleteBodyRows();
backTable.deleteBodyRows();
}
这个代码块就是问题所在。对于初学者来说,现在还为时过早。它需要放在 之后 count++;
语句。其次,不是在移动块后检查 count == 5
,而是检查 count == 6
达到了目的。此更改一发生,它就开始按预期正常工作。
这几乎意味着我不太擅长在转向 Stack Overflow 之前用尽所有选项...
我很确定我的问题最简单的答案是 "You need to update your version of iText." 但是,我的老板在从 iText 4 更新到 iText 5 后不愿意更新,正如他所说,"Broke so much crap." 所以我使用 iText 5.0.1 来构建这个 PDF。
我正在构建一个应用程序,它将读取 Excel 文件并为我们参加的活动创建徽章。它相当简单,一切都按预期工作,除了最终结果的样子。
我设置 PDF 的方式(代码将在下面显示)是每个徽章都印有正面和背面(我们双面打印),并且每个页面本身应该包含 6 个徽章。当我通过在每次销售中复制相同的徽章来测试它时,它看起来不错。但是当我使用一组数据时,无论出于何种原因,我的 PDF 都会被丢弃。它不是每页 6 个徽章,而是有时 每页打印 6 个,其他时候每页打印 3 个。例如,我的 excel 文件有 21 行数据 - 要创建 21 个徽章。我每页有 3 组 3 个徽章,每页有 2 组 6 个徽章,分别设置为 3、6、6、3,分别对应每页上的徽章数量。
我是否遗漏了 3 页,每页 6 个徽章,然后一页只有 3 个徽章?
Document document = new Document(PageSize.LETTER, MARGIN, MARGIN, MARGIN, MARGIN);
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename));
document.open();
PdfContentByte cb = writer.getDirectContent();
buildDocument(document, badgeFronts, badgeBacks);
document.close();
public void buildDocument(Document document, ArrayList<PdfPTable> badgeFronts, ArrayList<PdfPTable> badgeBacks) throws DocumentException{
float[] frontTableWidths = {150f, 10f, 150f, 10f, 150f, 10f};
float[] backTableWidths = {10f, 150f, 10f, 150f, 10f, 150f};
PdfPTable frontTable = new PdfPTable(6);
frontTable.setWidths(frontTableWidths);
frontTable.setWidthPercentage(100);
PdfPTable backTable = new PdfPTable(6);
backTable.setWidths(backTableWidths);
backTable.setWidthPercentage(100);
int count = 0;
for(int i = 0; i < badgeFronts.size(); i++){
PdfPCell frontCell = new PdfPCell();
frontCell.setFixedHeight(260f);
frontCell.setBorderColor(BaseColor.GRAY);
PdfPCell backCell = new PdfPCell();
backCell.setFixedHeight(260f);
backCell.setBorderColor(BaseColor.GRAY);
if(count == 5){
count = 0;
document.add(frontTable);
document.newPage();
document.add(backTable);
document.newPage();
frontTable.deleteBodyRows();
backTable.deleteBodyRows();
}
PdfPTable front = badgeFronts.get(i);
PdfPTable back = badgeBacks.get(i);
frontCell.addElement(front);
backCell.addElement(back);
frontTable.addCell(frontCell);
frontTable.addCell("");
backTable.addCell("");
backTable.addCell(backCell);
if(i == badgeFronts.size() - 1){
document.add(frontTable);
document.newPage();
document.add(backTable);
document.newPage();
}
count++;
}
frontTable.completeRow();
backTable.completeRow();
}
以上是我的代码。我在其他地方的主要 table 单元格中创建了表格,并且可以在需要时显示它,但我认为没有必要。
if(count == 5){
count = 0;
document.add(frontTable);
document.newPage();
document.add(backTable);
document.newPage();
frontTable.deleteBodyRows();
backTable.deleteBodyRows();
}
这个代码块就是问题所在。对于初学者来说,现在还为时过早。它需要放在 之后 count++;
语句。其次,不是在移动块后检查 count == 5
,而是检查 count == 6
达到了目的。此更改一发生,它就开始按预期正常工作。
这几乎意味着我不太擅长在转向 Stack Overflow 之前用尽所有选项...