使用PDFBox旋转文本

6

我想使用pdfbox旋转文本,但是一直没有成功。我尝试设置textMatrix,但我的文本并没有按预期旋转。

有人知道如何将文本旋转90度吗?

这是我的代码:

contentStream.beginText();

 float tx = titleWidth / 2;
 float ty = titleHeight / 2;

contentStream.setTextMatrix(Matrix.getTranslateInstance(tx, ty)); 
contentStream.setTextMatrix(Matrix.getRotateInstance(Math.toRadians(90),tx,ty));
contentStream.setTextMatrix(Matrix.getTranslateInstance(-tx, -ty));

 contentStream.newLineAtOffset(xPos, yPos);

contentStream.setFont(font, fontSize);
contentStream.showText("Tets");
contentStream.endText();

感谢您的选择。
谢谢。

我不知道你想要做什么,但这里的问题是“setTextMatrix”设置了前一个文本矩阵,而不是将其转换。考虑先进行矩阵操作,然后只传递该矩阵一次。 - Tilman Hausherr
1
或者修改当前的变换矩阵。transform 方法不会设置,而是从左边进行乘法运算。话虽如此,确切地说,你想把旋转后的文本放在哪里还不太清楚。 - mkl
@TilmanHausherr 我已经尝试过了,但是没有成功。 - Michel Melhem
@mkl 我想在 xPos 和 yPos 处绘制旋转文本,我不希望我的文本移动,我只想让它围绕中心旋转。 - Michel Melhem
旋转是围绕位于左下角的(0,0)进行的。您需要通过拿一张纸,旋转它,然后考虑需要进行哪些平移以使文本出现在正确的位置来可视化它。 在我的看法中,旋转后需要进行的翻译是(0,-原始纸张宽度)。 - Tilman Hausherr
显示剩余2条评论
2个回答

7
这里有一个解决方案,可以绘制三页纸,一张未旋转的文本页,一张旋转了但保持坐标像规划横向打印一样的文本页,以及一张你想要的(围绕文本中心旋转的)文本页。我的解决方案很接近,它是围绕文本底部中心旋转的。
public static void main(String[] args) throws IOException
{
    PDDocument doc = new PDDocument();
    PDPage page1 = new PDPage();
    doc.addPage(page1);
    PDPage page2 = new PDPage();
    doc.addPage(page2);
    PDPage page3 = new PDPage();
    doc.addPage(page3);

    PDFont font = PDType1Font.HELVETICA;
    float fontSize = 20;
    int xPos = 100;
    int yPos = 400;
    float titleWidth = font.getStringWidth("Tets") / 1000;
    float titleHeight = fontSize;
    float tx = titleWidth / 2;
    float ty = titleHeight / 2;

    try (PDPageContentStream contentStream = new PDPageContentStream(doc, page1))
    {
        contentStream.beginText();

        contentStream.newLineAtOffset(xPos, yPos);

        contentStream.setFont(font, fontSize);
        contentStream.showText("Tets");
        contentStream.endText();
    }

    // classic case of rotated page
    try (PDPageContentStream contentStream = new PDPageContentStream(doc, page2))
    {
        contentStream.beginText();

        Matrix matrix = Matrix.getRotateInstance(Math.toRadians(90), 0, 0);
        matrix.translate(0, -page2.getMediaBox().getWidth());

        contentStream.setTextMatrix(matrix);

        contentStream.newLineAtOffset(xPos, yPos);

        contentStream.setFont(font, fontSize);
        contentStream.showText("Tets");
        contentStream.endText();
    }

    // rotation around text
    try (PDPageContentStream contentStream = new PDPageContentStream(doc, page3))
    {
        contentStream.beginText();

        Matrix matrix = Matrix.getRotateInstance(Math.toRadians(90), 0, 0);
        matrix.translate(0, -page3.getMediaBox().getWidth());

        contentStream.setTextMatrix(matrix);

        contentStream.newLineAtOffset(yPos - titleWidth / 2 - fontSize, page3.getMediaBox().getWidth() - xPos - titleWidth / 2 - fontSize);

        contentStream.setFont(font, fontSize);
        contentStream.showText("Tets");
        contentStream.endText();
    }
    doc.save("saved.pdf");
    doc.close();
}

1

这个例子围绕文本的左基线旋转,并使用矩阵平移将文本定位到特定点。 showText() 总是定位在旋转之前的位置 0,0。然后,矩阵平移将文本定位到旋转后的位置。

如果您希望文本具有另一个旋转点,请将文本旋转位置重新定位到 contentStream.newLineAtOffset(0, 0) 行中。

float angle = 35;
double radians = Math.toRadians(angle);
for (int x : new int[] {50,85,125, 200}) 
  for (int y : new int[] {40, 95, 160, 300}) {
    contentStream.beginText();
    
    // Notice the post rotation position
    Matrix matrix = Matrix.getRotateInstance(radians,x,y);
    contentStream.setTextMatrix(matrix);

    // Notice the pre rotation position
    contentStream.newLineAtOffset(0, 0);

    contentStream.showText(".(" + x + "," + y + ")");
    contentStream.endText();
  }

为了获取您想要旋转的文本的高度和宽度,请使用 font.getBoundingBox().getHeight()/1000*fontSizefont.getStringWidth(text)/1000*fontSize。这些值需要乘以字体大小(fontSize),保留HTML标签,不做其他解释。

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