iTextPDF 7 добавить текст в абсолютное положение

У меня есть старый сценарий 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);

Я не смог понять, как преобразовать это в Java с помощью iTextPDF 7.

Итак, как мне с iTextPDF 7 установить текст в абсолютное положение?

Получить текущую ширину этого текстового объекта?


person mightymouse3062    schedule 28.01.2017    source источник
comment
Пожалуйста, не просто публикуйте код Perl, а вместо этого точно опишите, что вы хотите сделать. iText — это библиотека Java/.Net, пользователи iText не обязательно знакомы с Perl и, в частности, с PDF::API2.   -  person mkl    schedule 30.01.2017


Ответы (1)


Я даю вам код очень высокого и низкого уровня. Это высокий уровень, потому что он позволяет устанавливать свойства очень высокого уровня, такие как расстояние между словами и символами, выравнивание по ширине, использование сложных скриптов и т. д. без изменения подхода к расчету размера шрифта. С другой стороны, это низкий уровень, потому что вы будете выполнять много ручной работы по макету, которая обычно выполняется за кулисами.

Обратите внимание, что это только один из подходов к тому, чего вы пытаетесь достичь. Я могу вспомнить по крайней мере два других. Вы можете пойти и поискать образцы 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();

Вот как выглядит вывод: введите здесь описание изображения Обратите внимание, что мы добавили красный фон, чтобы текст был расположен по центру.

person Alexey Subach    schedule 30.01.2017