java - 使用 PDFBox 2.0 更改图像位置
问题描述
我已经使用下面的代码添加了一个二维码图像,效果很好。以下是它当前显示的快照:
现在,根据其他要求需要更改已经添加的二维码的位置。根据请求参数,我可以获得与位置相关的参数。但我不知道我应该采取什么措施来实现这一目标。任何一个,
- 通过首先删除现有图像,然后再次添加新的位置值或
- 需要更改现有的添加图像逻辑以通过其他方式实现。
请指导我,因为我刚开始使用 PDFBox。下面是添加图片的参考代码:
PDDocument pdDocument = PDDocument.load(new File(SourceFilePath()));
int total = pdDocument.getNumberOfPages();
PDPage page = pdDocument.getDocumentCatalog().getPages().get(0);
PDRectangle rectangle = getRotatedMediaBox(page);
PDPage pdPage = new PDPage(rectangle);
PDDocument newDocument = new PDDocument();
for (int i = 0; i < total; i++) {
pdPage = newDocument.importPage(pdDocument.getPage(i));
PDRectangle pageRect = getRotatedMediaBox(pdPage);
int rotation = pdPage.getRotation();
PDRectangle cropBoxRect = page.getCropBox();
//Calculate margin between crop box rectangle and page rectangle.
float[] margins = getCropBoxMargin(pageRect, cropBoxRect, rotation);
if (rotation == 90 || rotation == 270) {
cropBoxRect = new PDRectangle(cropBoxRect.getLowerLeftY(), cropBoxRect.getLowerLeftX(), cropBoxRect.getHeight(),
cropBoxRect.getWidth());
}
BufferedImage bufferedImage = getImage();
PDPageContentStream pageContentStream = new PDPageContentStream(newDocument, pdPage,
PDPageContentStream.AppendMode.APPEND, true);
PDImageXObject image = JPEGFactory.createFromImage(newDocument, bufferedImage);
if (rotation == 90 || rotation == 270) {
Matrix matrix = Matrix.getRotateInstance(Math.toRadians(rotation), 0, 0);
PDRectangle cropBox = pdPage.getCropBox();
float tx = (cropBox.getLowerLeftX() + cropBox.getUpperRightX()) / 2;
float ty = (cropBox.getLowerLeftY() + cropBox.getUpperRightY()) / 2;
Rectangle rectang = cropBox.transform(matrix).getBounds();
float scale = Math.min(cropBox.getWidth() / (float)rectang.getWidth(), cropBox.getHeight() / (float)rectang.getHeight());
pageContentStream.transform(Matrix.getTranslateInstance(tx, ty));
pageContentStream.transform(matrix);
pageContentStream.transform(Matrix.getScaleInstance(scale, scale));
pageContentStream.transform(Matrix.getTranslateInstance(-tx, -ty));
}
XMPMetadata xmp = XMPMetadata.createXMPMetadata();
DublinCoreSchema dc = xmp.createAndAddDublinCoreSchema();
dc.setTitle(imgUniqueId);
XmpSerializer serializer = new XmpSerializer();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
serializer.serialize(xmp, baos, true);
PDMetadata metadata = new PDMetadata(pdDocument);
metadata.importXMPMetadata(baos.toByteArray());
image.setMetadata(metadata);
pageContentStream.drawImage(image, rectLlx, rectLly, qrImageSize, qrImageSize);
pageContentStream.close();
}
newDocument.save(new File(DestinationFilePath(false)));
newDocument.close();
pdDocument.close();
解决方案
推荐阅读
- python - 优化清理 n-gram 的运行时间
- google-cloud-platform - 使用多磁盘 GCP 对多个 VM 进行 Terraform
- c - 我试图通过在 c 语言中使用递归来反转一个数字,但输出没有改变
- sql - SQL获取条件存在的第一个日期
- windows - cmake-gui 缺少 GUI 元素
- angularjs - 将值传递给同级组件
- python - 无法为张量“x:0”提供形状 (0,) 的值,其形状为“(?, 224, 224)
- php - 在单个博客文章中删除图像时如何减少图像顺序。拉拉维尔
- python - 用转置向量计算向量
- html - 如何以自适应宽度和高度将谷歌图表(html文件)嵌入到html网页中