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

Java 使用PDFBox旋转多个形状的问题,java,pdf,matrix,pdfbox,Java,Pdf,Matrix,Pdfbox,我制作了一个小java工具来从输入数据生成PDF蓝图,我使用PDFBox库来生成 当我在程序中添加一个矩形时,我想旋转它。对于一个矩形,它工作得很好,但是当我有几个矩形时,程序就不工作了 为了说明我的问题,我想做以下几点: 这就是我的程序所提供的: 显然,我对matrix有问题。有人能指引我吗 另外,是否有人知道用于生成蓝图的特定java库 谢谢你的帮助 代码如下: publicstaticvoidmain(字符串[]args){ PDDocument doc=新的PDDocument();

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

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

为了说明我的问题,我想做以下几点:

这就是我的程序所提供的:

显然,我对matrix有问题。有人能指引我吗

另外,是否有人知道用于生成蓝图的特定java库

谢谢你的帮助

代码如下:

publicstaticvoidmain(字符串[]args){
PDDocument doc=新的PDDocument();
试一试{
PDPage page=新PDPage();
文件添加页(第页);
PDPageContentStream内容=新的PDPageContentStream(doc,page,AppendMode.APPEND,true);
float[]fTx={100100500340};
float[]fTy={500700700300};
Color[]cArray={Color.BLUE,Color.RED,Color.ORANGE,Color.MAGENTA};
int[]tAngles={0,-90,180,90};/*度*/
内角;
int-previousAngle=0;
/*  */
addRect(100500400200);
contents.stroke();
对于(int i=1;i<4;i++){
/*转化*/
转换(矩阵.getTranslateInstance(fTx[i-1],fTy[i-1]);
变换(矩阵。getRotateInstance(数学。托拉迪安(缠结[i-1]-先前的角度),0,0));
previousAngle=缠结[i-1];
转换(矩阵.getTranslateInstance(-fTx[i-1],-fTy[i-1]);
/*形状*/
内容。SetNonSrokingColor(cArray[i-1]);
addRect(fTx[i-1],fTy[i-1],100,20);
contents.fillAndStroke();
contents.setNonSrokingColor(Color.GREEN);
addRect(fTx[i-1],fTy[i-1],5,5);
contents.fillAndStroke();
}
/*标签*/
contents.setNonSrokingColor(颜色为黑色);
contents.beginText();
目录。newLineAtOffset(300400);
contents.setFont(PDType1Font.HELVETICA,10);
内容。showText(“测试标签”);
contents.endText();
contents.closeAndStroke();
/*结束*/
contents.close();
doc.save(System.getProperty(“user.home”)+“/Desktop/testPDFBox.pdf”);
doc.close();
/*打开生成的pdf*/
文件f=新文件(System.getProperty(“user.home”)+“/Desktop/testPDFBox.pdf”);
Desktop.getDesktop().open(f);
}捕获(IOE异常){
e、 printStackTrace();
}
}
旧图书馆:

  • fontbox-2.0.16.jar
  • pdfbox-2.0.16.jar
  • pdfbox-app-2.0.16.jar
  • pdfbox-tools-2.0.16.jar
  • 飞行前-2.0.16.jar
  • 飞行前-app-2.0.16.jar
  • xmpbox-2.0.16.jar

Victor.

这很有效,我保存并恢复了图形状态,这更容易理解。我还调整了最后的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();

}
PDPageContentStream contents=新的PDPageContentStream(doc,page,AppendMode.APPEND,true);
//float[]fTx={100100500340};
//float[]fTy={500700700300};
float[]fTx={100100500500};
float[]fTy={500700700500};
Color[]cArray={Color.BLUE,Color.RED,Color.ORANGE,Color.MAGENTA};
int[]tAngles={0,-90,180,90};/*程度上*/
/*程度上*/
内角;
//int-previousAngle=0;
/*  */
addRect(100500400200);
contents.stroke();

对于(int i=1;i,我保存并恢复了图形状态,这更容易理解。我还调整了最后的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();

}
PDPageContentStream contents=新的PDPageContentStream(doc,page,AppendMode.APPEND,true);
//float[]fTx={100100500340};
//float[]fTy={500700700300};
float[]fTx={100100500500};
float[]fTy={500700700500};
Color[]cArray={Color.BLUE,Color.RED,Color.ORANGE,Color.MAGENTA};
int[]tAngles={0,-90,180,90};/*度*/
/*程度上*/
内角;
//int-previousAngle=0;
/*  */
addRect(100500400200);
contents.stroke();

对于(int i=1;我感谢你(被适度删除,但我可以看到)很好的回答/评论。对于2D几何,PDFBox只有PDF本身所能提供的。这带来了一些奇怪的效果,例如,没有圆的操作,所以这必须用贝塞尔曲线来近似。(幸运的是,这里也有解释)你好,蒂尔曼。是的,这是一个为圆圈感到羞耻,但图书馆是非常先进的!我喜欢它!确实有一个函数(自制)与贝塞尔曲线。下次见谢谢你(删除适度,但我可以看到它)回答/评论不错。关于二维几何,PDFBox只有PDF本身所能提供的。这带来了一些奇怪的效果,例如,没有圆的运算,因此必须用贝塞尔曲线近似。(幸运的是,这里也有解释)你好,蒂尔曼。是的,这是一个遗憾的圆圈,但图书馆是非常先进的!我喜欢它!确实有一个函数(自制)与贝塞尔曲线。再见,下次