我使用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后读取?
答案 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中的签名添加到预定义的空间(使用pageFooter
或lastPageFooter
波段)
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
写入文件。