将段落或单元格以任意角度旋转 -- Itext

11

我有一个网站,用户可以上传照片并创建相册。此外,他们还可以在绝对位置、旋转和对齐方式下添加文本。文本可以有换行符。

我一直在使用Itext库来自动创建稍后打印的Photobooks高质量PDF。

将用户上传的图像添加到PDF中非常简单,但当我尝试添加文本时就会出现问题。

理论上,我需要做的是定义一个指定宽度和高度的段落,设置用户的文本、字体、字体样式、对齐方式(居中、左对齐、右对齐、两端对齐)以及最后设置旋转。

从我了解的Itext方面来看,我可以创建一个段落,设置用户属性,然后使用ColumnText对象设置绝对位置、宽度和高度。但是,无法为大于单行的任何内容设置旋转。

我也不能使用表格单元格,因为旋转方法只允许是90的倍数度数。

有没有一种方法可以添加具有某些旋转(比如20度)的段落,而不必使用ColumnText.showTextAligned()方法逐行添加文本并涉及所有数学计算呢?

----编辑:08-Ago-2013----

如果有帮助的话,这是我用来解决这个问题的代码(感谢Bruno):

//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
编辑了问题并附上了我使用的代码。 - BernalCarlos
2个回答

10
  • 创建一个PdfTemplate对象,它只是一个矩形。
  • 在这个PdfTemplate上绘制你的ColumnText;不用担心旋转,只需使用任何内容填充矩形来添加到列中。
  • PdfTemplate包装在一个Image对象中;这只是为了方便起见,避免进行计算。这并不意味着您的文本将被光栅化。
  • 现在对Image应用旋转和绝对位置,并将其添加到您的文档中。

您的问题现在已得到解决 ;-)

附注:我是iText in Action书籍的作者。


@BrunoLowagie,当使用ColumnText.setSimpleColumn().setText(myPhrase)时,这是否也是旋转文本的最佳方法,如iText in Action(第2版)第3.3.1章所述? - Ben
看一下在StackOverflow上最好的iText问题中如何回答这个问题。实际上,你的问题已经在对这个问题所做的编辑中得到了解答。唯一的区别是BernalCarlos在复合模式下使用ColumnText,而你正在使用文本模式。这个区别在免费的电子书中有解释。 - Bruno Lowagie

1
感谢我们的两位朋友(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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接