使用PDFBox 2.0.8添加PNG至PDF时颜色丢失(仅显示黑色)
PNG图片添加到PDF后丢失颜色仅显示黑色(PDFBox 2.0.8 + Java 8)
在Java 8环境下使用PDFBox 2.0.8版本,将PNG图片添加至PDF文件时,图片能正常显示但丢失所有颜色,仅呈现黑色。即使修改图片部分区域为红色,添加到PDF后依然是黑色,涉及的图片对象为PDImageXObject pdImageStamp。
问题代码
private String addStampSignatureImageToPage(PDDocument pdDoc, PDPage pdPage, String stampPath, String signaturePath, String locationOnPdf) throws Exception { StandardFunctions stdClass = new StandardFunctions(); //Decode file settings String[] fileSettings = locationOnPdf.split(","); PDImageXObject pdImageStamp = null; PDImageXObject pdImageSignature = null; PDPageContentStream contentStream = null; Matrix matrix = null; if (fileSettings == null || fileSettings.length != 9) { //No Settings found do not add stamp return "No file settings for location found, no stamp added"; } int stampWidth = Integer.valueOf(fileSettings[0]); int stampHeight = Integer.valueOf(fileSettings[1]); int stampX = Integer.valueOf(fileSettings[2]); int stampY = Integer.valueOf(fileSettings[3]); int signatureWidth = Integer.valueOf(fileSettings[4]); int signatureHeight = Integer.valueOf(fileSettings[5]); int signatureX = Integer.valueOf(fileSettings[6]); int signatureY = Integer.valueOf(fileSettings[7]); int rotateDegree = Integer.valueOf(fileSettings[8]); try { //Define the stamp image BufferedImage awtImage = ImageIO.read(new File(stampPath)); System.out.println("3"); //pdImageStamp = PDImageXObject.createFromFile(stampPath, pdDoc); pdImageStamp = LosslessFactory.createFromImage(pdDoc, awtImage); pdImageStamp.setWidth(stampWidth); pdImageStamp.setHeight(stampHeight); //Define the signature image pdImageSignature = PDImageXObject.createFromFile(signaturePath, pdDoc); pdImageSignature.setWidth(signatureWidth); pdImageSignature.setHeight(signatureHeight); //Page stream that we want to append our image to. contentStream = new PDPageContentStream(pdDoc, pdPage, PDPageContentStream.AppendMode.APPEND, true); matrix = new Matrix(); //If we want to rotate the image we apply it to our matrix to transform the page. if (rotateDegree > 0) { matrix.rotate(Math.toRadians(rotateDegree)); contentStream.transform(matrix); } //Add the stamp to the pdf contentStream.drawImage(pdImageStamp, stampX, stampY, stampWidth, stampHeight); //Add the signature to the pdf contentStream.drawImage(pdImageSignature, signatureX, signatureY, signatureWidth, signatureHeight); //Close stream contentStream.close(); } catch (Exception e) { stdClass.writeLog("Something crashed...Signature stamp image" + e.getMessage()); } finally { stdClass = null; fileSettings = null; pdImageStamp = null; pdImageSignature = null; contentStream = null; matrix = null; } return "DONE"; }
问题原因与解决方法
排查后确认:创建PDImageXObject对象后,直接调用setWidth()和setHeight()修改图片尺寸的操作会破坏图片的颜色信息,导致颜色丢失。
正确的处理方式是移除对pdImageStamp.setWidth()和pdImageStamp.setHeight()的调用,转而在绘制图片时通过contentStream.drawImage()方法的参数指定目标宽高,即保留contentStream.drawImage(pdImageStamp, stampX, stampY, stampWidth, stampHeight)这一步的尺寸设置即可,此方法对PNG文件完全有效。
内容的提问来源于stack exchange,提问作者Renier
相关产品推荐
相关产品推荐

