有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

pdf iText冲压Java

我无法在不使数字签名失效的情况下为PDF文档加盖公章

目前,我成功地在PDF上盖章。但是,如果文件之前已签名,则签名不再有效。我理解为什么会发生这种情况,但如果我使用Acrobat添加文本或使用注释盖章,签名是有效的

我尝试添加注释或注释,但仍然会使签名无效。有没有一种方法可以在不使数字签名失效的情况下使用iText向PDF添加戳记

下面是我用来盖章的代码片段:

        PdfReader reader = new PdfReader(inputstream);

        stamp = new PdfStamper(reader, new FileOutputStream(file));


        PdfContentByte pcb;
        BaseFont bf = BaseFont.createFont("Courier", BaseFont.CP1250,BaseFont.EMBEDDED);

        Rectangle r = reader.getPageSizeWithRotation(1);

        pcb = stamp.getOverContent(1);

        // set the font and size
        float size = 12;
        pcb.setFontAndSize(bf, size);

        float width = 90;
        float centerX = 0, startY = 0;
        centerX = r.getWidth() - (width / 2) - 20;
        startY = r.getHeight() - (15 * 2) - 145;

        pcb.beginText();
        pcb.showTextAligned(PdfContentByte.ALIGN_CENTER, stampText, centerX, startY, 0);

        pcb.setFontAndSize(bf, 10);
        pcb.showTextAligned(PdfContentByte.ALIGN_CENTER, date, centerX-9, startY-8, 0);
        pcb.endText();
        stamp.close();          

任何帮助都将不胜感激, 谢谢


共 (1) 个答案

  1. # 1 楼答案

    我做到了’:)

    下面是使用iText向文档添加自定义文本而不使数字签名无效的代码

    //Read the source PDF
    PdfReader reader = new PdfReader(inputstream);
    //Create PdfStamp object
    stamp = new PdfStamper(reader, new FileOutputStream(file), '\0', true);
    
    //Create the proper annotation
    PdfAnnotation annot = PdfAnnotation.createFreeText(stamp.getWriter(),  new Rectangle(150, 150, 200, 200), "Annotation 1", pcb);
    annot.setFlags(PdfAnnotation.FLAGS_PRINT);
    
    //Insert the annotation         
    stamp.addAnnotation(annot, 1);
    //Close the stamp
    stamp.close();  
    

    编辑:

    为了在文档中插入图像戳而不使数字签名无效,我使用了以下代码:

    //Read the pdf 
    PdfReader reader = new PdfReader(inputstream);
    //Use PdfStamper in append mode
    stamp = new PdfStamper(reader, new FileOutputStream(file), '\0', true); 
    
    //Read the image
    Image img = Image.getInstance(ImageIO.read(imgStream), null);
    
    float w = img.getScaledWidth();
    float h = img.getScaledHeight();
    Rectangle location = new Rectangle(70, 770 - h, 70 + w, 770);
    
    //Create stamp annotation           
    PdfAnnotation stampAnnot = PdfAnnotation.createStamp(stamp.getWriter(), location, null, "ITEXT");
    img.setAbsolutePosition(0, 0);
    //Create new PdfContentByte from the stamp writer
    //If you use cd = stamp.getOverContent(1) - you'll invalidate the signatures
    PdfContentByte cb = new PdfContentByte(stamp.getWriter());
    PdfAppearance app = cb.createAppearance(w, h);
    app.addImage(img);
    stampAnnot.setAppearance(PdfName.N, app);
    stampAnnot.setFlags(PdfAnnotation.FLAGS_PRINT);
    
    stamp.addAnnotation(stampAnnot, 1);
    reader.close();