Поворот абзацев или ячеек на произвольное количество градусов - Itext

У меня есть веб-сайт, где пользователи загружают фотографии и создают фотокниги. Кроме того, они могут добавлять текст в абсолютных позициях, поворотах и ​​выравниваниях. Текст может иметь новые строки.

Я использую библиотеку Itext для автоматизации создания PDF-файлов Photobooks высокого качества, которые напечатаны позже.

Добавление загруженных пользователем изображений в PDF-файлы было действительно простым, проблема возникает, когда я пытаюсь добавить текст.

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

Из того, что я читал об Itext, я мог бы создать абзац, задать свойства пользователя, и использовать объект ColumnText, чтобы установить абсолютную позицию, ширину и высоту. Однако не возможно установить вращение чего-то большего, чем одна линия.

Я также не могу использовать ячейки таблицы, потому что метод вращения допускает только градусы, кратные 90.

Есть ли способ добавить абзац с некоторым поворотом (скажем, на 20 градусов), не добавляя текст построчно, используя ColumnText.showTextAligned() метод и вся математика, которая включает в себя?

---- Редактировать: 08-Ago-2013 ----

Если это кому-нибудь поможет, вот код, который я использовал для решения этой проблемы (спасибо Бруно):

//Create the template that will contain the text
PdfContentByte canvas = pdfWriter.getDirectContent();
PdfTemplate textTemplate = canvas.createTemplate(imgWidth, imgHeight); //The width and height of the text to be inserted

ColumnText columnText = new ColumnText(textTemplate);

columnText.setSimpleColumn(0, 0, imgWidth, imgHeight);
columnText.addElement(paragraph);

columnText.go();

//Create de image wraper for the template
Image textImg = Image.getInstance(textTemplate);

//Asign the dimentions of the image, in this case, the text
textImg.setInterpolation(true);
textImg.scaleAbsolute(imgWidth, imgHeight);
textImg.setRotationDegrees((float) -textComp.getRotation()); //Arbitrary number of degress
textImg.setAbsolutePosition(imgXPos, imgYPos);

//Add the text to the pdf
pdfDocument.add(textImg);

2 ответа

Решение
  • Создать PdfTemplate объект; просто прямоугольник.
  • Нарисуйте свой ColumnText на этом PdfTemplate; не беспокойтесь о повороте, просто заполните прямоугольник любым содержимым, которое вы хотите добавить в столбец.
  • Обернуть PdfTemplate внутри Image объект; это просто для удобства, чтобы избежать математики. Это не означает, что ваш текст будет растеризован.
  • Теперь примените вращение и абсолютную позицию к Image и добавьте его в свой документ.

Ваша проблема теперь решена;-)

PS: я автор книг iText in Action.

Благодаря обоим нашим друзьям (Bruno & BernalCarlos) мой окончательный код для пользователей, использующих "RTL" в своих проектах, находится здесь:

// step 1
Document document = new Document();
document.setPageSize(PageSize.A4);

// step 2
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(destination_file));
CreateBorder event = new CreateBorder();
writer.setPageEvent(event);

// step 3
document.open();

// step 4
int imgWidth=400;
int imgHeight=50;
//Create the template that will contain the text
PdfContentByte canvas = writer.getDirectContent();
PdfTemplate textTemplate = canvas.createTemplate(imgWidth, imgHeight);
//The width and height of the text to be inserted

ColumnText columnText = new ColumnText(textTemplate);
columnText.setSimpleColumn(0, 0, imgWidth, imgHeight);
columnText.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);
columnText.addElement(new Paragraph("محاسبه بار غیر متعادل", font_IranSemiBold));
columnText.go();

//Create de image wraper for the template
Image textImg = Image.getInstance(textTemplate);

//Asign the dimentions of the image, in this case, the text
textImg.setInterpolation(true);
textImg.scaleAbsolute(imgWidth, imgHeight);
textImg.setRotationDegrees(90); //Arbitrary number of degress
textImg.setAbsolutePosition(50, 200);

//Add the text to the pdf
document.add(textImg);

// step 5
document.close();
Другие вопросы по тегам