簡體   English   中英

如何提高pdf中嵌入的簽名圖像的質量

[英]How to improve quality of signature image embedded in pdf

我正在一個Web應用程序上將簽名嵌入到pdf文檔中。 我正在使用以下庫Zetakey Sign&Send 。從簽名板簽名使用以下命令捕獲:

var dataURL = canvas.toDataURL("image/png",1);

並且在服務器端(首先對簽名字符串進行Base64解碼):

    public String createSignature(String mySignature,int width,int height) throws IOException {
    String filePath = SIGNATURE_PATH +"signature_" + new Date().getTime() + ".png";
    byte[] imageByteArray = decodeImage(mySignature);
    try(FileOutputStream imageOutFile = new FileOutputStream(filePath)){
        imageOutFile.write(imageByteArray);
    }
    try {
        BufferedImage image = ImageIO.read(new File(filePath));
        image = scaleImage(image, width, height);
        ImageIO.write(image, "png", new File(filePath));
        for(Iterator<ImageWriter> iw = ImageIO.getImageWritersByFormatName("png"); iw.hasNext();) {
            ImageWriter writer = iw.next();
            ImageWriteParam writeParam = writer.getDefaultWriteParam();
            ImageTypeSpecifier typeSpecifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB);
            IIOMetadata metadata = writer.getDefaultImageMetadata(typeSpecifier, writeParam);
            if(metadata.isReadOnly() || !metadata.isStandardMetadataFormatSupported()) {
                continue;
            }
            setDPI(metadata,500,width,height);
            try (ImageOutputStream stream = ImageIO.createImageOutputStream(new FileOutputStream(filePath))){
                writer.setOutput(stream);
                writer.write(metadata, new IIOImage(image, null, metadata), writeParam);
            }
            break;

        }
    } catch (IOException e) {
          logger.error(e.getMessage());
    }

    return filePath;
}

private static void setDPI(IIOMetadata metadata, int value, int width, int height) throws IIOInvalidTreeException {
    double dotsPerMilli = value/(INCH_TO_CM*10);

    IIOMetadataNode horiz = new IIOMetadataNode("HorizontalPixelSize");
    horiz.setAttribute(VAL, Double.toString(dotsPerMilli));
    IIOMetadataNode vert = new IIOMetadataNode("VerticalPixelSize");
    vert.setAttribute(VAL, Double.toString(dotsPerMilli));

    IIOMetadataNode horizScreenSize = new IIOMetadataNode("HorizontalScreenSize");
    horizScreenSize.setAttribute(VAL, Integer.toString(width));

    IIOMetadataNode vertScreenSize = new IIOMetadataNode("VerticalScreenSize");
    vertScreenSize.setAttribute(VAL, Integer.toString(height));

    IIOMetadataNode dim = new IIOMetadataNode("Dimension");
    dim.appendChild(horiz);
    dim.appendChild(vert);
    dim.appendChild(horizScreenSize);
    dim.appendChild(vertScreenSize);

    IIOMetadataNode root = new IIOMetadataNode("javax_imageio_1.0");
    root.appendChild(dim);

    metadata.mergeTree("javax_imageio_1.0", root);
}

public static BufferedImage scaleImage(BufferedImage original, int width, int height){
    BufferedImage scaled = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    AffineTransform at = new AffineTransform();
    at.scale(((float)width)/original.getWidth(), ((float)height)/original.getHeight());
    Map<RenderingHints.Key, Object> map = new HashMap<>();
    map.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    map.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    map.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    RenderingHints hints = new RenderingHints(map);
    AffineTransformOp scaleOp = new AffineTransformOp(at, hints);
    scaled = scaleOp.filter(original, scaled);
    return scaled;
}

但是,即使嘗試500 DPI,打印在pdf上的簽名圖像的質量也完全不能令人滿意。我錯過了什么嗎?

因此,使用ZetaKey的現場演示,簽名捕獲返回了可接受的高質量PNG圖像...

請考慮以下事項:

  • 我可以只使用原始的,不變的圖像嗎?
  • 如果沒有,我可以更改轉換順序嗎? (DPI-> Scale VS Scale-> DPI)
  • 我可以放棄縮放嗎? (通常是導致分辨率下降的原因)

我懷疑您正在失去圖像分辨率,因為縮放圖像后正在調整DPI。

縮放和DPI的影響:

圖像轉換(DPI)的效果

摘錄:(不直接相關,但可以深入了解問題)

現在,假設您要使用普通膠印機打印圖像,該膠印機最多可以打印300dpi圖像。 假設您嘗試以英寸為單位的原始圖像尺寸進行精確打印。 印刷機每英寸需要300個點才能做好。 您提供的圖像每英寸只有72個點,因此印刷機(或更准確地說,是為印刷機准備印版的軟件)必須彌補缺失的點。 結果將是模糊的或嘈雜的,因為該軟件將創造性地添加很多“過渡”點來填補缺失的空白。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM