将“将图像添加到pdf”从iText迁移到PDFBox

将“将图像添加到pdf”从iText迁移到PDFBox,itext,pdfbox,Itext,Pdfbox,在我们的项目中,我们使用iText 5.x版本来处理PDF文件,并使用PDFBox 2.x版本迁移该实现 有一个将图像添加到pdf页面的场景,我已经尽我所能将该代码转换为PDFBox在现有的实现(iText)中,他们使用PdfTemplate在模板中添加图像,并使用pdfantation类在注释中添加该模板 我不知道用PDFBox怎么做。另外,请检查我是否正确迁移了现有的实现,因为我是使用Java的PDF库的新手 将图像添加到PDF(使用iText): Document document = n

在我们的项目中,我们使用iText 5.x版本来处理PDF文件,并使用PDFBox 2.x版本迁移该实现

有一个将图像添加到pdf页面的场景,我已经尽我所能将该代码转换为PDFBox在现有的实现(iText)中,他们使用PdfTemplate在模板中添加图像,并使用pdfantation类在注释中添加该模板

我不知道用PDFBox怎么做。另外,请检查我是否正确迁移了现有的实现,因为我是使用Java的PDF库的新手

将图像添加到PDF(使用iText):

Document document = null;
        PdfReader pdfReader = null;
        
        pdfReader = new PdfReader(SourceFilePath());        
        
        //we retrieve the total number of pages and the page size
        int total = pdfReader.getNumberOfPages();
        Rectangle rectangle = pdfReader.getPageSizeWithRotation(1);
        
        document = new Document(rectangle);
        PdfImportedPage page;
        PdfCopy.PageStamp stamp;
        
        // step 2: we create a PdfCopy object that listens to the document.
        PdfCopy copy = new PdfCopy(document, new FileOutputStream(DestinationFilePath(false)); 
        
        document.open();
        
     // step 4: adding the content
        for (int i = 1; i <= total; i++) {
            page = copy.getImportedPage(pdfReader, i);
            if(i == 1 || aBarcodeVO.getDisplacementVO().isApplyForAllPages()){
                BufferedImage bufferedImage = getImage();
                
                Image img =  Image.getInstance(bufferedImage, null);
                img.scaleToFit(qrImageSize, qrImageSize);
    
                PdfName imgKey = new PdfName(aBarcodeVO.getImgUniqueId() + i);
                Rectangle rectPage = pdfReader.getPageSizeWithRotation(i);
                
                stamp = copy.createPageStamp(page);
    
                PdfImage stream = new PdfImage(img, "", null);
                stream.put(imgKey, imgKey);
                PdfIndirectObject ref = copy.addToBody(stream);
                
                int rotation = pdfReader.getPageRotation(i);
                Rectangle cropBoxRect = pdfReader.getCropBox(i);;
    
             
                
              //Explicitly Apply rotation to crop box rectangle. 
                for (int j = 0; j < (rotation/90); j++) {
                    cropBoxRect = cropBoxRect.rotate();
                }
                
                
                
                //added Image in template and template in Annotation and finally annotation is added in PDF through PdfCopy.PageStamp
                PdfTemplate template = PdfTemplate.createTemplate(copy, img.getPlainWidth(), img.getPlainHeight());
                img.setAbsolutePosition(0, 0);
                img.setRotationDegrees(rotation);
                img.setDirectReference(ref.getIndirectReference());
                template.addImage(img);
    
                Rectangle rect = new Rectangle(rectLlx, rectLly, rectUrx, rectUry);
                rect.setBorderWidth(0.5f);
                rect.setBorderColor(new BaseColor(0xFF, 0x00, 0x00));
                
                PdfAnnotation annotation = PdfAnnotation.createStamp(copy, rect, null, "AnnotationOnly");
                annotation.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, template);
                annotation.setFlags(PdfAnnotation.FLAGS_PRINT + PdfAnnotation.FLAGS_LOCKED);
                annotation.setRotate(rotation);
                PdfName annotKey = getAnnotKey(i);
                annotation.put(annotKey, annotKey);
                stamp.addAnnotation(annotation); 
                stamp.alterContents();
            }
            copy.addPage(page);
        }
        copy.freeReader(pdfReader);
        
        try {
            if (document != null) {
                document.close();
            }
        } catch (Exception e) {
            System.out.println("Exception in handleAddBarCode() while closing():document:" + e);
        }
        try {
            if (pdfReader != null) {
                pdfReader.close();
            }
        } catch (Exception e) {
            System.out.println("Exception in handleAddBarCode() while closing():pdfReader:" + e);
        }
    
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));
    }
    
    pageContentStream.drawImage(image, rectLlx, rectLly, qrImageSize, qrImageSize);
    pageContentStream.close();
}
newDocument.save(new File(DestinationFilePath(false)));

newDocument.close();
pdDocument.close();
单据单据=null;
PdfReader PdfReader=null;
pdfReader=新的pdfReader(SourceFilePath());
//我们检索页面总数和页面大小
int total=pdfReader.getNumberOfPages();
矩形矩形=pdfReader.GetPageSizeWebRotation(1);
文件=新文件(矩形);
PDF导入页面;
PdfCopy.PageStamp;
//步骤2:我们创建一个PdfCopy对象来侦听文档。
PdfCopy copy=新的PdfCopy(文档,新文件输出流(DestinationFilePath(false));
document.open();
//步骤4:添加内容

对于(int i=1;i通常使用Apache PDFBox比使用iText库更难完成任务。您应该准确地告诉我们PDFBox代码的错误,以便我们知道要查找什么。与iText解决方案相比,您的PDFBox解决方案将图像放在页面内容中,而不是放在批注中。可以吗?@mkl so i使用PDFBox可以实现相同的功能吗?(将图像放入注释)或者这不是强制性的。@Tim Biegeleisen根据我的代码,我想问的是,PDFBox实现与iText实现相比在行为上有什么不同?“那么使用PDFBox可以实现相同的功能吗?(将图像放入注释)-是的,可能比iText要详细一点。“或者这不是强制性的”——这取决于指定代码要做什么。