回答来自ChatGPT!!!
在 Apache PDFBox 中,可以使用 `PDPage` 和 `PDPageContentStream` 来检测当前页面是否能够容纳要写入的内容,并在需要时自动创建新的页面。下面是一个示例代码,演示了如何实现这个功能:
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import java.io.IOException;
public class NewPageExample {
public static void main(String[] args) {
try (PDDocument document = new PDDocument()) {
PDPage page = new PDPage();
document.addPage(page);
PDPageContentStream contentStream = new PDPageContentStream(document, page);
float pageWidth = page.getMediaBox().getWidth();
float pageHeight = page.getMediaBox().getHeight();
float startX = 50; // 文字起始 x 坐标
float startY = pageHeight - 50; // 文字起始 y 坐标
// 要写入的内容
String content = "这是要写入的内容,可能超过页面的高度。";
// 计算内容需要的行数
float lineHeight = 15; // 行高
float remainingHeight = pageHeight - startY;
int linesPerPage = (int) (remainingHeight / lineHeight);
String[] lines = content.split("\n");
int lineIndex = 0;
while (lineIndex < lines.length) {
if (lineIndex > 0 && lineIndex % linesPerPage == 0) {
// 创建新的页面
page = new PDPage();
document.addPage(page);
contentStream.close();
contentStream = new PDPageContentStream(document, page);
startY = pageHeight - 50; // 更新起始 y 坐标
}
// 写入内容
contentStream.beginText();
contentStream.newLineAtOffset(startX, startY);
contentStream.showText(lines[lineIndex]);
contentStream.endText();
startY -= lineHeight;
lineIndex++;
}
contentStream.close();
document.save("path/to/output.pdf");
} catch (IOException e) {
e.printStackTrace();
}
}
}
建议,把while中的部分抽取为一个方法,if里的条件因需求不同而不同!!
在上述示例中,我们首先创建了一个 `PDPage` 对象并将其添加到文档中。然后,我们创建了一个 `PDPageContentStream` 对象,用于在当前页面上绘制内容。接下来,我们获取当前页面的宽度和高度,并定义了起始的 x 坐标和 y 坐标。
我们假设每行的高度为 15,并根据当前页面剩余的高度计算出每页可以容纳的行数。然后,我们将要写入的内容根据换行符 `\n` 进行分割,并逐行写入。
在每次写入一行内容后,我们检查是否需要创建新的页面。当行数达到每页容纳的最大行数时,我们创建一个新的页面,并更新起始的 y 坐标。然后,我们继续写入下一行内容。
最后,我们关闭 `PDPageContentStream`,保存文档到指定路径。
通过这种方式,当要写入的内容
超过当前页面的高度时,会自动创建新的页面并将剩余的内容写入新页面。这样就可以保证内容能够适应页面大小,并在需要时自动分页。