想請問為什么我的圖片無法顯示出來,但是可以點擊圖片顯示的區域,點擊之后也能夠彈出圖片的資訊代碼如下:
private InputStream createVisualSignatureTemplate3(PDDocument srcDoc,PDRectangle rect,BufferedImage image, int pageNum,
PDSignature signature) throws IOException {
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);
//創建第一個Form(N)
PDStream stream = new PDStream(doc);
PDFormXObject form = new PDFormXObject(stream);
PDResources res = new PDResources();
form.setResources(res);
form.setFormType(1);
PDRectangle bbox = new PDRectangle(rect.getWidth(), rect.getHeight());
form.setBBox(bbox);
//創建ProcSet
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);
//創建FRM
PDStream stream1 = new PDStream(doc);
PDFormXObject frm = new PDFormXObject(stream1);
res.put(COSName.getPDFName("FRM"),frm);
//添加frm的屬性
frm.setFormType(1);
frm.setBBox(bbox);
PDResources res1 = new PDResources();
frm.setResources(res1);
//創建ExGState并添加屬性
PDExtendedGraphicsState extGState = new PDExtendedGraphicsState();
extGState.setAlphaSourceFlag(false);
extGState.setBlendMode(BlendMode.DARKEN);
extGState.setNonStrokingAlphaConstant(1.0f);
extGState.setStrokingOverprintControl(true);
res1.put(COSName.getPDFName("NtkoExt"),extGState);
//再次添加ProcSet
res1.getCOSObject().setItem(COSName.PROC_SET,procSet);
ByteArrayOutputStream bao = new ByteArrayOutputStream();
ImageIO.write(image,"png", bao);
bao.flush();
byte[] imageByte = bao.toByteArray();
bao.close();
BufferedImage clone = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g2d = clone.createGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.drawImage(image, 0, 0, null);
g2d.dispose();
int width2 = clone.getWidth();
int height2 = clone.getHeight();
for (int i = 0; i < width2; i++) {
for (int j = 0; j < height2; j++) {
int rgb = clone.getRGB(i, j);
int b = (0xff & rgb);
int g = (0xff & (rgb >> 8));
int r = (0xff & (rgb >> 16));
int gray = (int) (0.3 * r + 0.59 * g + 0.11 * b);
if ((r > 120) && (g < 250) && (b < 250)) {
rgb = gray + (gray << 8) + (gray << 16) + (180 << 24);
} else {
rgb = gray + (gray << 8) + (gray << 16) + (1 << 24);
}
clone.setRGB(i, j, rgb);
}
}
ByteArrayOutputStream bao2 = new ByteArrayOutputStream();
ImageIO.write(clone,"png", bao2);
bao2.flush();
byte[] imageByte2 = bao2.toByteArray();
bao2.close();
//創建image
PDImageXObject ximage = PDImageXObject.createFromByteArray(doc, imageByte, null);
PDImageXObject ximage2 = PDImageXObject.createFromByteArray(doc, imageByte2, null);
COSDictionary images = new COSDictionary();
images.setItem("Sign0",ximage);
images.setItem("Sign1",ximage2);
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);
if (isDecryption) {
contentStream.drawImage(ximage,0, 0,rect.getWidth(),rect.getHeight());
} else {
contentStream.drawImage(ximage2,0, 0,rect.getWidth(),rect.getHeight());
}
contentStream.close();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
doc.save(baos);
doc.close();
return new ByteArrayInputStream(baos.toByteArray());
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/271071.html
標籤:Java SE
上一篇:svn權限例外不給登陸
