简体   繁体   English

java 使用pdfbox添加带签名的图片

[英]java using pdfbox to add pictures with signature

I tried the example:CreateVisualSignature2.java,but it didn't work.我尝试了示例:CreateVisualSignature2.java,但没有成功。 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()

在此处输入图像描述

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.非常感谢蒂尔曼·豪舍尔。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM