java - 一页一行 : Boxable

标签 java pdf boxable

这是这个问题的代码,您可以检查一下代码是否有问题。

现在的问题是,当我将行数限制为 45(该数字适合一页)时,每一行都将打印在一页上。

但是,如果我不限制行数和行大小(大约 100-200),则每一行都会转到 PDF 中的新页面。 PDF 页码大约等于行号。

我已经在 Boxable 的 git 中打开了这个问题,但它不活跃,所以我来这里寻求帮助。

以下是两种情况下生成的文件:

LimitTemp.pdf

noLimitTemp.pdf

public class CSVtoPDF {

private float marginBetweenYElements = 10;
private float titleFontSize = 18;
private float fontSize = 8;
private float headerFontSize = 12;
private float header1FontSize = 14;
private float header2FontSize = 12;
private float headerCellHeight = 19;
private float dataCellHeight = 12;
private PDFont font = PDType1Font.HELVETICA;
private PDFont headerFont = PDType1Font.TIMES_BOLD;
List filteredData = new ArrayList();
ReportSettings rs = new ReportSettings();
String filePath, destPath, header1, header2, filename;

public CSVtoPDF(List data, Audit audit) throws IOException {
this.filteredData = data;
Date liveDate = new Date();
SimpleDateFormat format= new SimpleDateFormat("YYYY-MM-DD HH:mm:ss");
liveDate = Calendar.getInstance().getTime();
float headerCellHeight = 18;
PDDocument doc = new PDDocument();
PDPage page = new PDPage(PDRectangle.A4);
//page.setMediaBox(new PDRectangle(PDRectangle.A4.getHeight(),
//        PDRectangle.A4.getWidth()));
PDPageContentStream cos = new PDPageContentStream(doc, page);

/* Add page to PDDocument */
doc.addPage(page);
System.out.println("Inside Main csvtopdf");

//Draw Header
Preferences prefs = Preferences.userRoot().node(this.getClass().getName());
try {
    String[] keys = prefs.keys();
    //destPath = prefs.get("destpath", rs.getDestPath());
    //filename = prefs.get("file_name", rs.getFileName());
    //header1 = prefs.get("header1", rs.getHeader1());
    //header2 = prefs.get("header2", rs.getHeader2());

} catch (BackingStoreException ex) {
    System.err.println(ex);
}
header1= "Header 1";
header2= "Header 2";

cos.beginText();
cos.moveTextPositionByAmount(220, 810);
cos.setFont(headerFont, header1FontSize);
cos.drawString(header1);
cos.endText();
cos.beginText();
cos.moveTextPositionByAmount(220, 800);
cos.setFont(headerFont, header2FontSize);
cos.drawString(header2);
cos.endText();
cos.beginText();
cos.moveTextPositionByAmount(220, 790);
cos.setFont(headerFont, headerFontSize);
cos.drawString("Report: Filtered Audit Report");
cos.endText();

//cos.beginText();
// cos.moveTo(200, 30);
//cos.setFont(headerFont, headerFontSize);
// cos.drawString(header2);
//cos.endText();

/* Initialize DataTable */
float margin = 20;
float tableWidth = page.getMediaBox().getWidth() - (2 * margin);
float yStartNewPage = page.getMediaBox().getHeight() - (2 * margin);
float yStart = yStartNewPage;
float bottomMargin = -800;

BaseTable table = new BaseTable(yStart, yStartNewPage,
        bottomMargin, tableWidth, margin, doc, page, true, true);
Row<PDPage> dataRow = table.createRow(dataCellHeight);
for (int i = 0; i < data.size() - 1; i++) {
    System.out.println(data.get(i));
}
drawTableData(table, dataCellHeight, 20, data, 1,doc,page);

table.draw();
File result;
if (Objects.isNull(destPath)) {
    cos.close();
    result = new File("temp.pdf");
} else {
    result = new File(destPath);
}
System.out.println("befor save result");
doc.save(result);
System.out.println("after save result");
}

public void drawTableData(BaseTable table, float dataCellHeight, float 
cellWidth, List<Audit> data, int style,PDDocument doc,PDPage page) {

String s;
Cell<PDPage> cell;
//  for (int k = 0; k < data.size(); k++) {
System.out.println("inside drawtable for ");

for (int i = 0; i < data.size(); i++) {       // add row
    System.out.println("inside drawtable for " + i);
    Audit atmp = data.get(i);
    //if (i==35) {
     //   doc.addPage(page);
    //}
    Row<PDPage> sTableRow = table.createRow(dataCellHeight);
    for (int j = 0; j <= 2; j++) {       //add cell in the rows
        if (j == 0) {          // normal cells on right

            s = atmp.getTimeStamp();
            s = s.replaceAll("^\"|\"$", "");
            cell = sTableRow.createCell(cellWidth, s, HorizontalAlignment.CENTER, VerticalAlignment.BOTTOM);
            setStyle(style, cell);
            //k++;
        } else if (j == 1) {      //big cells on left
            s = atmp.getDiscription();
            s = s.replaceAll("^\"|\"$", "");
            cell = sTableRow.createCell(cellWidth + 50, s, HorizontalAlignment.CENTER, VerticalAlignment.BOTTOM);
            setStyle(style, cell);
            // k++;
        } else if (j == 2) {      //top blank cell
            //System.out.println("In j null and 0 " + j);
            s = atmp.getUserID();
            s = s.replaceAll("^\"|\"$", "");
            cell = sTableRow.createCell(cellWidth - 10, s, HorizontalAlignment.CENTER, VerticalAlignment.BOTTOM);
            //cell.setBottomBorderStyle(null);
            setStyle(style, cell);
            //k++;
        }
    }
    table.addHeaderRow(sTableRow);
    System.out.println(" row added ");
}
//}
}

public void setStyle(int type, Cell cell) {
// type :  0 as header, 1 as table body
if (type == 0) {
    cell.setFont(headerFont);
    //cell.setHeight(headerCellHeight);
    cell.setFontSize(headerFontSize);
    cell.setBottomPadding(3);
} else if (type == 1) {
    cell.setTopPadding(1);
    cell.setFont(font);
    cell.setAlign(HorizontalAlignment.LEFT);
    //cell.setHeight(dataCellHeight);
    cell.setFontSize(fontSize);
    cell.setBottomPadding(1);
}
}

最佳答案

我在我的代码中发现了一个愚蠢的问题。我这么说是为了让其他人不要重复这件事。

我将数据表的每一行都视为标题行。于是就到了新的页面。 再具体一点。在函数 drawTableData 中,我删除了 table.addHeaderRow(sTableRow)

关于java - 一页一行 : Boxable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51153039/

相关文章:

java - 有人知道 JDeveloper/SQL Developer 使用什么加密技术来持久化凭据吗?

pdfbox - Helvetica 字体中没有 U+000D 字形

encoding - PDFBox - 如何将编码从 WinAnsiEncoding 更改为 Unicode?

javascript - 如何替换一个占位符单词?

R ggplot2 : Blank page before plot with pdf() and ggplot_gtable()/ggplot_build()

ruby-on-rails - 使用 ruby​​ 将文本添加到现有 pdf

java - 尝试将 ResultSet 打印为 PDF 文件

java - 选择其他 JComboBox 值时清除 JList

java - 用数组查找素数

java - Java 中是否有带有 MySQL 的非常小的 CMS?