Поворот абзацев или ячеек произвольным числом градусов - 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);

Ответ 1

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

Ваша проблема решена, -)

PS: Я автор книг iText в действии.

Ответ 2

благодаря нашим друзьям (Бруно и Бернал Карлос) мой окончательный код для пользователей, которые используют "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();