如何在 jasperreport 生成的 pdf 中找到放置签名的位置?

How to locate position in pdf generated with jasperreport to place a signature?

我用 JAVA 和 jasper 生成了一个 PDF 文件。这样的jasper文件是用iReport设计的。创建 pdf 文件后,我想在 pdf 的具体位置放置一个带有 PdfStamper 的签名。我找到的可能解决方案:

使用PdfSignatureAppearance.setVisibleSignature方法。这不符合我的需要,因为它将签名定位在基于坐标的位置。

PdfStamper stp = PdfStamper.createSignature(reader, outStream, '[=10=]', fileTmp);
PdfSignatureAppearance sap = stp.getSignatureAppearance();
sap.setVisibleSignature(new Rectangle(100, 100, 200, 200), 1, null);

使用 PdfReader.getAcroFields() 然后遍历 AcroFields,获取预定义表单字段的坐标并插入签名,如前一个选项所示。问题是我无法使用 iReport 定义 AcroFields,所以我也无法使用它。

我的问题:有什么方法可以在使用 Java 创建 PDF 后使用 iReport 定义字段并读取?

您可以使用 PdfReaderContentParser 在 pdf 中查找图像和文本。

示例(显示如何在 pdf 中查找文本和图像的位置)

PdfReader reader = new PdfReader(src);
int pageILikeToCheck =reader.getNumberOfPages(); //set the page or loop them all        
final String matchStr = "FIND THIS TEXT";

PdfReaderContentParser parser = new PdfReaderContentParser(reader);
parser.processContent(pageILikeToCheck, new RenderListener() {  

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

    @Override
    public void renderText(TextRenderInfo renderInfo) {

        if(renderInfo.getText().length()>0 && matchStr.contains(renderInfo.getText())){
            System.out.println("FOUND MY TEXT");
            System.out.println(renderInfo.getBaseline().getStartPoint());
            System.out.println(renderInfo.getBaseline().getEndPoint());
        }
    }

    @Override
    public void endTextBlock() {
    }

    @Override
    public void beginTextBlock() {
    }
});

但是我通常使用 PdfStamper

将 pdf 中的签名添加到预定义的 space(使用 pageFooterlastPageFooter 带)
PdfReader reader = new PdfReader(src);
java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
PdfStamper stamper = new PdfStamper(reader, baos);
int pageSignature=1;
stamper.addSignature("Signature", pageSignature, 320, 570, 550, 620);

然后将baos写入文件。