我正在尝试使用PDFBox在Java中创建pdf文件。该文件包含一个包含2列的大表。为了使表格成为pdf,我正在使用另一个库:boxable。
文件已成功创建,表格也已呈现。但是当其中一行包含大数据时会出现问题。在这种情况下,表格会拆分并且不会正确显示数据:
当第一页保持为空时,大行会自动移动到新页面。在第二页中,行突然在输入用于测试的新任务结束,而不在单元格中显示整个数据。 这是一个反复出现的问题,并不是特定于这种情况。
Row<PDPage> headerRow;
Row<PDPage> row;
Cell<PDPage> cell;
int i;
headerRow = table.createRow(15f);
cell = headerRow.createCell(30, "Goal Category");
cell.setFont(PDType1Font.HELVETICA);
cell.setFontSize(11);
cell = headerRow.createCell(70, "My Goal");
cell.setFont(PDType1Font.HELVETICA);
cell.setFontSize(11);
table.addHeaderRow(headerRow);
for(i=0;i<goals.size();i++)
{
ArrayList<String> goal=goals.get(i);
row = table.createRow(12);
cell = row.createCell(30, goal.get(0));
cell.setFont(PDType1Font.HELVETICA);
cell.setFontSize(11);
System.out.println("My Goal="+goal.get(1));
cell = row.createCell(70, goal.get(1));
cell.setFont(PDType1Font.HELVETICA);
cell.setFontSize(11);
}
table.draw();
我正在寻找以PDF格式呈现表格的解决方案或替代方法。
答案 0 :(得分:0)
似乎图书馆无法处理令人满意的分页符。 在这种情况下,商业工作马 itext 值得一提。
自己准备分页以查看分页符,对多行中的行进行抢占式分割可能是一种实用的解决方案。
下面的行最多只能限制每页的行数,依赖于这些行,然后分页工作正常。
public int lineno;
public int linesPerPage = 50; // Not counting header lines.
public void splitRow(List<String> multilineRow) {
在多行中拆分单行单元格值(此处忽略自动换行):
List<List<String>> sublines = new ArrayList<>(multilineRow.size());
int sublineCount = 0;
for (String cellValue : multilineRow) {
List<String> column = Arrays.asList(cellValue.split("\r?\n"));
sublines.add(column);
sublineCount = Math.max(sublineCount, column.size());
}
然后我们每列都有子行,并将几个子行捆绑成一行:
for (int sublineI = 0; sublineI < sublineCount; ) {
int linesPerRow = Math.min(sublineCount, linesPerPage - lineno);
if (linesPerRow <= 0) {
break;
}
int sublineI2 = sublineI + linesPerRow;
List<String> cellValues = new ArrayList<>(multilineRow.size());
for (int j = 0; j < multilineRow.size(); ++j) {
List<String> column = sublines.get(j);
String value = "";
if (sublineI < column.size()) {
List<String> vs = column.subList(sublineI,
Math.min(sublineI2, column.size()));
value = vs.stream().collect(Collectors.joining("\n"));
}
cellValues.add(value);
}
createRow();
++lineno;
.... fill with cellValues.get(0) and get(1)
sublineI = sublineI2;
if (lineno >= linesPerPage) {
lineno = 0
}
//if (sublineI < sublineCount) {
// Page break / createHeader;
//}
}
}
这不是一个非常可靠的解决方案。但它可能会提供一个补丁,直到删除库错误。
答案 1 :(得分:0)
您可以使用此代码段将大文本分成适合每个页面的块(已测试):
private static final int MAX_LINES = 95;
...
String[] lignes = ch.split("\r?\n");
StringBuilder sb = new StringBuilder();
int nblignes = 0;
for (String ligne : lignes) {
nblignes++;
sb.append(ligne).append("\n");
if (nblignes % MAX_LINES == 0) {
row = table.createRow(10);
cell = row.createCell(100, sb.toString());
sb = new StringBuilder();
}
}
if (sb.length() > 0) {
row = table.createRow(10);
cell = row.createCell(100, sb.toString());
}