Search code examples
javapdfpdfboxdigital-signature

java using pdfbox to add pictures with signature


I tried the example:CreateVisualSignature2.java,but it didn't work. Why can't my picture be displayed, but can click on the area where the picture is displayed, and the picture information can also be displayed after clicking, but the picture cannot be seen.

PDDocument doc = new PDDocument();
PDPage page = new PDPage(srcDoc.getPage(pageNum).getMediaBox());
doc.addPage(page);

PDAcroForm acroForm = new PDAcroForm(doc);
doc.getDocumentCatalog().setAcroForm(acroForm);

PDSignatureField signatureField = new PDSignatureField(acroForm);
PDAnnotationWidget widget = signatureField.getWidgets().get(0);
signatureField.setValue(signature);

List<PDField> acroFormFields = acroForm.getFields();
acroForm.setSignaturesExist(true);
acroForm.setAppendOnly(true);
acroForm.getCOSObject().setDirect(true);
acroFormFields.add(signatureField);

widget.setRectangle(rect);
widget.setPage(page);
page.getAnnotations().add(widget);
PDFormXObject form = new PDFormXObject(doc);
PDResources res = new PDResources();
PDRectangle bbox = new PDRectangle(rect.getWidth(), rect.getHeight());
form.setResources(res);
form.setFormType(1);
form.setBBox(bbox);

COSArray procSet = new COSArray();
procSet.add(COSName.getPDFName("PDF"));
procSet.add(COSName.getPDFName("Text"));
procSet.add(COSName.getPDFName("ImageB"));
procSet.add(COSName.getPDFName("ImageC"));
procSet.add(COSName.getPDFName("ImageI"));
res.getCOSObject().setItem(COSName.PROC_SET,procSet);

PDFormXObject frm = new PDFormXObject(doc);
PDResources res1 = new PDResources();
res.put(COSName.getPDFName("FRM"),frm);

frm.setResources(res1);
frm.setFormType(1);
frm.setBBox(bbox);

PDExtendedGraphicsState extGState = new PDExtendedGraphicsState();
extGState.setAlphaSourceFlag(false);
extGState.setBlendMode(BlendMode.DARKEN);
extGState.setNonStrokingAlphaConstant(1.0f);
extGState.setStrokingOverprintControl(true);
res1.put(COSName.getPDFName("Ext"),extGState);
res1.getCOSObject().setItem(COSName.PROC_SET,procSet);

ByteArrayOutputStream bao = new ByteArrayOutputStream();
ImageIO.write(image,"png", bao);
bao.flush();
byte[] imageByte = bao.toByteArray();
bao.close();

PDImageXObject ximage = PDImageXObject.createFromByteArray(doc, imageByte, null);
COSDictionary images = new COSDictionary();
images.setItem("Sign0",ximage);
res1.getCOSObject().setItem(COSName.XOBJECT,images);

PDAppearanceDictionary appearance = new PDAppearanceDictionary();
appearance.getCOSObject().setDirect(true);
PDAppearanceStream appearanceStream = new PDAppearanceStream(form.getCOSObject());
appearance.setNormalAppearance(appearanceStream);
widget.setAppearance(appearance);

PDAppearanceStream pdAppearanceStream = new PDAppearanceStream(frm.getCOSObject());
PDPageContentStream contentStream = new PDPageContentStream(doc, pdAppearanceStream);

contentStream.drawImage(ximage,0, 0,rect.getWidth(),rect.getHeight());

contentStream.close();

ByteArrayOutputStream baos = new ByteArrayOutputStream();

doc.save(baos);
doc.close();
return new ByteArrayInputStream(baos.toByteArray()

enter image description here


Solution

  • Add code:

    PDAppearanceStream pdStream = new PDAppearanceStream(form.getCOSObject());         
    PDPageContentStream cStream = new PDPageContentStream(doc, pdStream);         
    cStream.drawForm(frm);         
    cStream.close();
    

    Thank you very much Tilman Hausherr.