iTextPDF 7在绝对位置添加文本

时间:2017-01-28 18:22:33

标签: java itext itext7

我有一个旧的Perl脚本生成一个.pdf文件,可以打印在穿孔卡片上(如Avery模板28878)。我正在将这个脚本转换为Java并选择使用iTextPDF 7.到目前为止,我可以毫无问题地生成10个“卡”(使用绝对位置)。

我正在尝试在绝对位置向每个“卡片”添加文本,并根据字体大小的宽度设置该文本的字体大小。

至于字体大小部分,我在旧的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 将文本设置为绝对位置?

获取该文本对象的当前宽度?

1 个答案:

答案 0 :(得分:2)

我给你的代码既是高水平又是低水平。它是高级别的,因为它允许设置非常高级别的属性,如字/字符间距,对齐,使用复杂的脚本等,而无需修改字体大小计算的方法。另一方面,它是低级别的,因为你将进行大量的手动布局工作,这通常是在幕后完成的。

请注意,这只是您尝试实现目标的一种方法。我至少可以想到其他两个。您可以去寻找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();

这是输出的外观:enter image description here 请注意,我们添加了红色背景,以查看文本是否居中。