我制作了一个小型java工具来根据输入数据生成PDF蓝图,我使用PDFBox库进行生成。
当我向程序中添加一个矩形时,我想旋转它。对于一个矩形,它工作得很好,但是当我有多个矩形时,程序就不起作用了。
为了说明我的问题,我想做的是:
这就是我的程序给出的:
显然,我对矩阵有疑问。谁能指导我吗?
另外,有谁知道用于生成蓝图的特定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/