PDFBox: как создать новую страницу и разместить текст после полной страницы

plshm спросил: 31 июля 2018 в 09:40 в: java
//for writing filenames           
PDDocument doc = PDDocument.load(this.getClass().getResourceAsStream("/Vorlagen/Analyze/ReportTemplate.pdf"));
PDPage curFileNamePage = new PDPage(PDRectangle.A4);
doc.addPage(curFileNamePage);contentStream = new PDPageContentStream(doc, curFileNamePage, PDPageContentStream.AppendMode.APPEND, true, true);
contentStream.setFont(pdfFont, 12);
contentStream.beginText();
float curYVal = 650f;
contentStream.newLineAtOffset(20, curYVal);for (int idx = 0; idx < 377; idx++) {
    if (curYVal - 15f > 0) {
        curYVal = curYVal - 15f;
        contentStream.newLineAtOffset(0, curYVal);
        contentStream.showText("" + idx);
    } else {
        contentStream.endText();
        contentStream.close(); // close writing area
        curFileNamePage = new PDPage(PDRectangle.A4);
        doc.addPage(curFileNamePage);        contentStream = new PDPageContentStream(doc, curFileNamePage, PDPageContentStream.AppendMode.APPEND, true, true);
        contentStream.setFont(pdfFont, 12);
        contentStream.beginText();
        curYVal = 650f;
        contentStream.newLineAtOffset(0, curYVal);
        contentStream.showText("" + idx);
            }}
contentStream.endText();
contentStream.close(); // close writing areadoc.save("C:\\Users\\noname\\Desktop\\765.pdf");//Saving the document
doc.close();

Итак, у меня есть ряд индексов (в данном случае 377). Моя цель - создать pdf, где индексы печатаются один за другим. (в этом случае он должен идти на 15f вниз по оси y). Если конец страницы был достигнут, он должен создать новую страницу и начать с начала.

Теперь, как вы догадались бы, код не будет вести себя так, как должен. После выполнения кода файл pdf создается с 9 страницами, но смешная часть - это каждая страница, содержащая только одно число (кроме первой страницы). Число: 43,87,131,175,219,263,307,351.

Что я делаю неправильно?

Вот как выглядит результат:

Это мой выходной ток:

1 ответ

Есть решение
Tilman Hausherr ответил: 31 июля 2018 в 10:24

Измените первое (не второе)

contentStream.newLineAtOffset(0, curYVal);

на

contentStream.newLineAtOffset(0, -15f);

, поскольку это относительная позиция. Таким образом, большое значение имеет смысл только в первый раз в текстовом сегменте (когда оно относительно 0,0). После первого позиционирования просто вычтите смещение.