iTextPDF 7 在绝对位置添加文本
iTextPDF 7 add text at absolute position
我有一个旧的 Perl 脚本,它生成一个 .pdf 文件,可以打印在穿孔卡片上(例如 Avery 模板 28878)。我正在将此脚本转换为 Java 并选择使用 iTextPDF 7。到目前为止,我可以毫无问题地生成 10 "cards"(使用绝对位置)。
我试图在绝对位置为每个 "card" 添加文本,并根据字体大小的宽度设置该文本的字体大小。
至于字体大小部分,我在旧的 Perl 脚本中执行以下操作,它与 PDF::API2
配合得很好
# Font size 16 width = 184.832
$nameText->font($fonts->{'times'}, $nameFontSize);
while(int($nameText->advancewidth($name)) > 185){
$nameFontSize--;
$nameText->font($fonts->{'times'}, $nameFontSize);
}
为了实际设置绝对位置,我在 Perl 中执行以下操作
my $nameText = $pdfPage->text();
$nameText->translate(($xCoord + 151), ($yCoord + 73));
$nameText->text_center($name);
我无法弄清楚如何使用 iTextPDF 7 将其转换为 Java。
那么,我如何使用 iTextPDF 7
将文本设置为绝对位置?
获取该文本对象的当前宽度?
我给你的是非常高级和低级的代码。它是高级的,因为它允许设置非常高级的属性,如 word/char 间距、对齐、使用复杂的脚本等,而无需修改字体大小计算方法。另一方面,它是低级别的,因为您将进行大量通常在幕后完成的手动布局工作。
请注意,这只是您要实现的目标的一种方法。我至少可以想到另外两个。你可以去寻找iText7示例来寻找灵感。
PdfDocument pdfDocument = new PdfDocument(new PdfWriter("..."));
pdfDocument.addNewPage();
int pageNumber = 1;
PdfPage page = pdfDocument.getPage(pageNumber);
String text = "Hello World! This is an answer to a SO question";
Paragraph paragraph = new Paragraph(text).
setMargin(0).
setMultipliedLeading(1).
setFont(PdfFontFactory.createFont(FontConstants.TIMES_ROMAN));
float fontSize = 50;
paragraph.setFontSize(fontSize);
paragraph.setBackgroundColor(Color.RED); // Just to see that text is aligned correctly
float allowedWidth = 185;
Canvas canvas = new Canvas(new PdfCanvas(page), pdfDocument, page.getMediaBox());
RootRenderer canvasRenderer = canvas.getRenderer();
while (paragraph.createRendererSubTree().setParent(canvasRenderer).layout(new LayoutContext(new LayoutArea(pageNumber, new Rectangle(allowedWidth, fontSize * 2)))).getStatus() != LayoutResult.FULL) {
paragraph.setFontSize(--fontSize);
}
float xCoord = 151;
float yCoord = 73;
paragraph.setWidth(allowedWidth);
canvas.showTextAligned(paragraph, xCoord, yCoord, TextAlignment.CENTER);
canvas.close();
pdfDocument.close();
这是输出的样子:
请注意,我们添加了红色背景以查看文本是否居中。
我有一个旧的 Perl 脚本,它生成一个 .pdf 文件,可以打印在穿孔卡片上(例如 Avery 模板 28878)。我正在将此脚本转换为 Java 并选择使用 iTextPDF 7。到目前为止,我可以毫无问题地生成 10 "cards"(使用绝对位置)。
我试图在绝对位置为每个 "card" 添加文本,并根据字体大小的宽度设置该文本的字体大小。
至于字体大小部分,我在旧的 Perl 脚本中执行以下操作,它与 PDF::API2
配合得很好# Font size 16 width = 184.832
$nameText->font($fonts->{'times'}, $nameFontSize);
while(int($nameText->advancewidth($name)) > 185){
$nameFontSize--;
$nameText->font($fonts->{'times'}, $nameFontSize);
}
为了实际设置绝对位置,我在 Perl 中执行以下操作
my $nameText = $pdfPage->text();
$nameText->translate(($xCoord + 151), ($yCoord + 73));
$nameText->text_center($name);
我无法弄清楚如何使用 iTextPDF 7 将其转换为 Java。
那么,我如何使用 iTextPDF 7 将文本设置为绝对位置?
获取该文本对象的当前宽度?
我给你的是非常高级和低级的代码。它是高级的,因为它允许设置非常高级的属性,如 word/char 间距、对齐、使用复杂的脚本等,而无需修改字体大小计算方法。另一方面,它是低级别的,因为您将进行大量通常在幕后完成的手动布局工作。
请注意,这只是您要实现的目标的一种方法。我至少可以想到另外两个。你可以去寻找iText7示例来寻找灵感。
PdfDocument pdfDocument = new PdfDocument(new PdfWriter("..."));
pdfDocument.addNewPage();
int pageNumber = 1;
PdfPage page = pdfDocument.getPage(pageNumber);
String text = "Hello World! This is an answer to a SO question";
Paragraph paragraph = new Paragraph(text).
setMargin(0).
setMultipliedLeading(1).
setFont(PdfFontFactory.createFont(FontConstants.TIMES_ROMAN));
float fontSize = 50;
paragraph.setFontSize(fontSize);
paragraph.setBackgroundColor(Color.RED); // Just to see that text is aligned correctly
float allowedWidth = 185;
Canvas canvas = new Canvas(new PdfCanvas(page), pdfDocument, page.getMediaBox());
RootRenderer canvasRenderer = canvas.getRenderer();
while (paragraph.createRendererSubTree().setParent(canvasRenderer).layout(new LayoutContext(new LayoutArea(pageNumber, new Rectangle(allowedWidth, fontSize * 2)))).getStatus() != LayoutResult.FULL) {
paragraph.setFontSize(--fontSize);
}
float xCoord = 151;
float yCoord = 73;
paragraph.setWidth(allowedWidth);
canvas.showTextAligned(paragraph, xCoord, yCoord, TextAlignment.CENTER);
canvas.close();
pdfDocument.close();
这是输出的样子: