You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 00:05:19