java - 使用 PDFBox 旋转多个形状的问题

标签 java pdf matrix pdfbox

我制作了一个小型java工具来根据输入数据生成PDF蓝图,我使用PDFBox库进行生成。

当我向程序中添加一个矩形时,我想旋转它。对于一个矩形,它工作得很好,但是当我有多个矩形时,程序就不起作用了。

为了说明我的问题,我想做的是:

First screen

这就是我的程序给出的:

Second screen

显然,我对矩阵有疑问。谁能指导我吗?

另外,有谁知道用于生成蓝图的特定java库吗?

感谢您的帮助,

代码在这里:

public static void main(String[] args) {
    PDDocument doc = new PDDocument();

    try {
        PDPage page = new PDPage();
        doc.addPage(page);

        PDPageContentStream contents = new PDPageContentStream(doc, page, AppendMode.APPEND, true);

        float[] fTx = { 100, 100, 500, 340 };
        float[] fTy = { 500, 700, 700, 300 };
        Color[] cArray = { Color.BLUE, Color.RED, Color.ORANGE, Color.MAGENTA };

        int[] tAngles = { 0, -90, 180, 90 }; /* in degree */
        int angle;
        int previousAngle = 0;

        /*  */
        contents.addRect(100, 500, 400, 200);
        contents.stroke();

        for (int i = 1; i < 4; i++) {

            /* transform */
            contents.transform(Matrix.getTranslateInstance(fTx[i - 1], fTy[i - 1]));
            contents.transform(Matrix.getRotateInstance(Math.toRadians(tAngles[i - 1] - previousAngle), 0, 0));
            previousAngle = tAngles[i - 1];
            contents.transform(Matrix.getTranslateInstance(-fTx[i - 1], -fTy[i - 1]));

            /* Shapes */
            contents.setNonStrokingColor(cArray[i - 1]);
            contents.addRect(fTx[i - 1], fTy[i - 1], 100, 20);
            contents.fillAndStroke();

            contents.setNonStrokingColor(Color.GREEN);
            contents.addRect(fTx[i - 1], fTy[i - 1], 5, 5);
            contents.fillAndStroke();

        }

        /* label */
        contents.setNonStrokingColor(Color.BLACK);
        contents.beginText();
        contents.newLineAtOffset(300, 400);
        contents.setFont(PDType1Font.HELVETICA, 10);
        contents.showText("Test label");
        contents.endText();
        contents.closeAndStroke();

        /* End */
        contents.close();

        doc.save(System.getProperty("user.home") + "/Desktop/testPDFBox.pdf");
        doc.close();

        /* Open pdf generated */
        File f = new File(System.getProperty("user.home") + "/Desktop/testPDFBox.pdf");
        Desktop.getDesktop().open(f);

    } catch (IOException e) {
        e.printStackTrace();
    }
}

使用的库:

  • fontbox-2.0.16.jar
  • pdfbox-2.0.16.jar
  • pdfbox-app-2.0.16.jar
  • pdfbox-tools-2.0.16.jar
  • preflight-2.0.16.jar
  • preflight-app-2.0.16.jar
  • xmpbox-2.0.16.jar

维克多。

最佳答案

这有效,我保存并恢复了图形状态,这更容易理解。我还调整了最后的 x 和 y 平移值并增加了循环的上限。

PDPageContentStream contents = new PDPageContentStream(doc, page, AppendMode.APPEND, true);

//float[] fTx = { 100, 100, 500, 340 };
//float[] fTy = { 500, 700, 700, 300 };
float[] fTx = { 100, 100, 500, 500 };
float[] fTy = { 500, 700, 700, 500 };
Color[] cArray = { Color.BLUE, Color.RED, Color.ORANGE, Color.MAGENTA };

int[] tAngles = { 0, -90, 180, 90 }; /* in degree */
/* in degree */
int angle;
//int previousAngle = 0;

/*  */
contents.addRect(100, 500, 400, 200);
contents.stroke();

for (int i = 1; i <= 4; i++)
{
    contents.saveGraphicsState();
    /* transform */
    contents.transform(Matrix.getTranslateInstance(fTx[i - 1], fTy[i - 1]));
    contents.transform(Matrix.getRotateInstance(Math.toRadians(tAngles[i - 1] /* - previousAngle */), 0, 0));
    //TH not needed previousAngle = tAngles[i - 1];
    contents.transform(Matrix.getTranslateInstance(-fTx[i - 1], -fTy[i - 1]));

    /* Shapes */
    contents.setNonStrokingColor(cArray[i - 1]);
    contents.addRect(fTx[i - 1], fTy[i - 1], 100, 20);
    contents.fillAndStroke();

    contents.setNonStrokingColor(Color.GREEN);
    contents.addRect(fTx[i - 1], fTy[i - 1], 5, 5);
    contents.fillAndStroke();
    contents.restoreGraphicsState();

}

与问题无关:您不需要所有 jar 文件;如果您有应用程序,那么您不需要单独的 jar 。当前的 PDFBox 版本是 2.0.17。

关于java - 使用 PDFBox 旋转多个形状的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58281614/

相关文章:

python - 在Python中将数据列表的列表转换为矩阵(检查内部)

javascript - 使用 javascript 中的坐标更新 3d 矩阵

java - 在Google App Engine上配置Quercus

java - 如何扩展 JTree 节点(提前),但保持它们不可见

c# - 从 aspx 页面下载 PDF

python - 使用 Python 或 Bash 删除 PDF 的最后一页

Java 从另一个数组的通用运行时类型创建数组

java - 无法解析方法 'access$000()'

java - 在 iText 中使用 setEncryption 方法时是否可以仅设置所有者密码?

algorithm - 在 bool 矩阵中查找 1 的区域填充