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