Java 具有多个图像的PDF上的iText数字签名

Java 具有多个图像的PDF上的iText数字签名,java,pdf,itext,jasper-reports,digital-signature,Java,Pdf,Itext,Jasper Reports,Digital Signature,我有一个由Jasper Studio生成的PDF文件 在这个文件中,我添加了一个带有特定键的图像。此图像用作占位符以替换为数字签名(使用iText库) 因此,在我的PDF文件中有多个图像,因此我无法区分我的图像,因为使用ImageRenderInfo类,我无法在图像上获得名称,只能获得其扩展名(在我的例子中是PNG类型),但其他图像具有相同的图像类型(PNG) 我如何辨别自己的形象 这里是我的代码,要获取我的图像,在renderImage方法中,我尝试获取关于我的图像的信息: // To ret

我有一个由Jasper Studio生成的PDF文件

在这个文件中,我添加了一个带有特定键的图像。此图像用作占位符以替换为数字签名(使用iText库)

因此,在我的PDF文件中有多个图像,因此我无法区分我的图像,因为使用
ImageRenderInfo
类,我无法在图像上获得名称,只能获得其扩展名(在我的例子中是
PNG
类型),但其他图像具有相同的图像类型(PNG)

我如何辨别自己的形象

这里是我的代码,要获取我的图像,在
renderImage
方法中,我尝试获取关于我的图像的信息:

// To retrieve generated PDF
ByteArrayOutputStream baos = createTemporaryOutputStream();
JasperReportsUtils.render(exporter, populatedReport, baos);
ByteArrayInputStream in = new ByteArrayInputStream(baos.toByteArray());

// Get the reader
PdfReader reader = new PdfReader(in);
int pageILikeToCheck = reader.getNumberOfPages();
// Loop all over pages in my PDF to get my image
for (int currPage = 1; currPage <= pageILikeToCheck; currPage++) {
    String matchStr = "DMIMySignatureImg";

    PdfReaderContentParser parser = new PdfReaderContentParser(reader);
    parser.processContent(currPagina, new RenderListener() {
    private boolean foundText = false;

    @Override
    public void renderImage(ImageRenderInfo renderInfo) {
        PdfImageObject image;
        try {
            image = renderInfo.getImage();
            if (image == null) return;
            System.out.println("Found image");

            imageCTM = renderInfo.getImageCTM();
            foundText = true;
            System.out.println(renderInfo.getStartPoint());
            if (!foundText) {
                imageCTM = null;
            }
        } catch (IOException e) {
              e.printStackTrace();
        }     
    }

    @Override
    public void renderText(TextRenderInfo renderInfo) {
        if(renderInfo.getText().length()>0 && matchStr.contains(renderInfo.getText())){
            System.out.println(matchStr);
            System.out.println(renderInfo.getBaseline().getStartPoint());
            System.out.println(renderInfo.getBaseline().getEndPoint());
            foundText = true;
        }
    }

    @Override
    public void endTextBlock() {}

    @Override
    public void beginTextBlock() {}
});
//检索生成的PDF
ByteArrayOutputStream baos=createTemporaryOutputStream();
JasperReportsUtils.render(exporter、populatedReport、baos);
ByteArrayInputStream in=新的ByteArrayInputStream(baos.toByteArray());
//吸引读者
PdfReader读取器=新PdfReader(in);
int pageLiketocheck=reader.getNumberOfPages();
//在我的PDF中的所有页面上循环以获取我的图像
对于(int currPage=1;currPage 0&&matchStr.contains(renderInfo.getText())){
System.out.println(matchStr);
System.out.println(renderInfo.getBaseline().getStartPoint());
System.out.println(renderInfo.getBaseline().getEndPoint());
foundText=true;
}
}
@凌驾
public void endTextBlock(){}
@凌驾
public void beginTextBlock(){}
});

“我如何辨别我的图像?”-您对您的签名占位符图像了解多少,以便辨别?例如,您知道它的大小吗?该大小是唯一的?@mkl:Dear,在我的pdf中,可以显示多个图像占位符以供签名,因此我使用密钥进行区分(使用Jaspersoft Studio创建我的转载)。所以我把DMIMySignatureImg1,2等等。但在这一刻,我只放了一张图片作为签名,所以名字是DMIMySignatureImg。因此大小不能是唯一的。如何使用不同的图像来处理不同的签名?@mkl:我用两个图像(DMIMySignatureImg1,DMIMySignatureImg2)创建了我的文件,因为当我用签名替换时,用户可以用他的签名签名。因此,用户应用两次他的签名。但要做到这一点,我需要添加两个数字签名对象。幸运的是,在我的第一个PDF中,我的图像可以被替换(因为没有其他图像),但在我的其他PDF中,有多个图像用于不同的用途,我无法区分我的图像的签名要区分它们,你需要它们之间的差异。名称也没有帮助,Jasper中的文件名和图像名都没有帮助,因为它们不会进入PDF。如果您没有任何内容,则必须更改模板。“我如何区分我的图像?”-您对签名占位符图像了解多少,以便进行区分?例如,您知道它的大小吗?该大小是唯一的?@mkl:Dear,在我的pdf中,可以显示多个图像占位符以供签名,因此我使用密钥进行区分(使用Jaspersoft Studio创建我的转载)。所以我把DMIMySignatureImg1,2等等。但在这一刻,我只放了一张图片作为签名,所以名字是DMIMySignatureImg。因此大小不能是唯一的。如何使用不同的图像来处理不同的签名?@mkl:我用两个图像(DMIMySignatureImg1,DMIMySignatureImg2)创建了我的文件,因为当我用签名替换时,用户可以用他的签名签名。因此,用户应用两次他的签名。但要做到这一点,我需要添加两个数字签名对象。幸运的是,在我的第一个PDF中,我的图像可以被替换(因为没有其他图像),但在我的其他PDF中,有多个图像用于不同的用途,我无法区分我的图像的签名要区分它们,你需要它们之间的差异。名称也没有帮助,Jasper中的文件名和图像名都没有帮助,因为它们不会进入PDF。如果没有任何内容,则必须更改模板。