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

时间:2016-02-25 11:09:04

标签: java jasper-reports export-to-pdf pdf-reader

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

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

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

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

我的问题:有没有办法用iReport定义字段并在用Java创建PDF后读取?

1 个答案:

答案 0 :(得分:3)

您可以使用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中的签名添加到预定义的空间(使用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写入文件。