如何在 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(使用 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
写入文件。
我用 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(使用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
写入文件。