首页 > 解决方案 > 使用 PDFBox 2.0 更改图像位置

问题描述

我已经使用下面的代码添加了一个二维码图像,效果很好。以下是它当前显示的快照:

现有的二维码图像

现在,根据其他要求需要更改已经添加的二维码的位置。根据请求参数,我可以获得与位置相关的参数。但我不知道我应该采取什么措施来实现这一目标。任何一个,

  1. 通过首先删除现有图像,然后再次添加新的位置值或
  2. 需要更改现有的添加图像逻辑以通过其他方式实现。

请指导我,因为我刚开始使用 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();

标签: javapdfbox

解决方案


推荐阅读