繁体   English   中英

在java中使用Boxable和PDFBox将大表渲染为pdf文件

[英]Rendering large table to pdf file using Boxable and PDFBox in java

我正在尝试使用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 格式呈现表格的解决方案或替代方法。

您可以使用此代码段将大文本拆分为适合每个页面的块(已测试):

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());
}

似乎图书馆无法令人满意地处理分页符。 在这种情况下,商业工作马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;
        //}
    }
}

这不是一个非常可靠的解决方案。 但它可能会提供补丁,直到删除库错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM