我的目标是根据预定义的模板生成 PDF。我从 https://github.com/ralfstuckert/pdfbox-layout/开始,此时我正在评估https://github.com/LibrePDF/OpenPDF/(iText 2.1.7 fork)。
这是我想要的模板:
有两张图片并排。右图下方有文字与图片边界对齐,如果比图片本身长,可以换行。
然后会有几个段落。它们的垂直位置可以根据段落大小进行调整。
理想的 API 应该有一种方法,我可以在其中设置文本、对齐方式、光标位置和宽度,并将其呈现在框中。
我当前的代码:
Document document = new Document(PageSize.A4, 0, 0, 0, 0);
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("output.pdf"));
document.open();
PdfContentByte cb = writer.getDirectContent ();
addBorder(document, cb);
addPicture(document);
addPhoto(document, "This is some text –\ncontinued.\nLast line", cb);
document.close();
}
private static void addPicture(Document document) throws DocumentException, IOException {
Image image = Image.getInstance("picture.png");
image.scalePercent (40.0f);
image.setAbsolutePosition(90, 650);
document.add(image);
}
private static void addPhoto(Document document, String verse, PdfContentByte cb) throws DocumentException, IOException {
Image image = Image.getInstance("another_picture.png");
image.scalePercent (30.0f);
image.setAbsolutePosition(380, 650);
document.add(image);
Paragraph paragraph = new Paragraph(verse);
document.add(paragraph);
BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
cb.setFontAndSize(bf, 10);
cb.beginText();
cb.showTextAligned(PdfContentByte.ALIGN_LEFT, verse, 380, 650, 0);
cb.endText ();
}
private static void addBorder(Document doc, PdfContentByte cb) throws IOException, DocumentException {
cb.rectangle (doc.left(), doc.bottom(), doc.right() - doc.left (), doc.top() - doc.bottom ());
cb.stroke();
}
由于方法,我能够将两张图片放在我想要的位置setAbsolutePosition()
。但是没有类似的方法Paragraph
。我找到PdfContentByte
了可以根据需要定位文本的类,但它缺少Paragraph
文本换行或翻译换行符等基本功能。
PDF如何实现精准定位?我想重用现有代码,而不是计算每个句子的宽度并自己拆分。