作者:fyupeng
技术专栏:☞ https://github.com/fyupeng
项目地址:☞ https://github.com/fyupeng/distributed-blog-system-api
留给读者
遇到签名,往往很无奈签名的位置、大小。
一、介绍
直接提供PDF路径和图片路径,以及输出路径,就可以完成需要的需求,关键字也可以作为参数传入,根据自行需求修改。
二、代码
java
public class PdfBuilderUtil {
public static void imageWatermark(String inputPath, String outputPath,String imagePath) throws IOException, com.itextpdf.text.DocumentException {
PdfReader reader = new PdfReader(inputPath);
PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(outputPath));
PdfGState gs1 = new PdfGState();
gs1.setFillOpacity(0.1f);
InputStream imageIS = new FileInputStream(imagePath);
Image image = Image.getInstance(IOUtils.toByteArray(imageIS));
int n = reader.getNumberOfPages();
InputStream inputStream = new FileInputStream(inputPath);
PDDocument document = PDDocument.load(inputStream);
for(int i=1;i<=n;i++){
PdfContentByte pdfContentByte = stamp.getOverContent(i);
// 默认图片水印大小,详见盖章右下角大小样例
image.scalePercent(75f);
// 默认图片水印横坐标,详见盖章右下角横坐标
float absoluteX = 370;
// 默认图片水印纵坐标,高度中间位置
float absoluteY = (PageSize.POSTCARD.getHeight() - image.getScaledHeight())/2;
float[] xyz = getKeyWords(reader, "盖章位置");
if (xyz != null && xyz.length >= 3) {
//新版文书
absoluteY = xyz[1];
} else {
//旧版文书
float[] oldXyz = getKeyWords(reader, "其他位置");
if (oldXyz != null && oldXyz.length >= 3) {
absoluteY = oldXyz[2]+300;
}
}
// 读取图像文件
PDFTextStripper stripper = new PDFTextStripper();
stripper.setStartPage(i); // Page indexes are 1-based in PDFTextStripper
stripper.setEndPage(i);
String text = stripper.getText(document);
if (!text.trim().isEmpty()) {
image.setAbsolutePosition(absoluteX, absoluteY);
pdfContentByte.addImage(image);
}
}
inputStream.close();
imageIS.close();
stamp.close();
reader.close();
}
/**
* 根据关键字定位
* @param pdfReader
* @param keyWords
* @return
*/
public static float[] getKeyWords(PdfReader pdfReader, String keyWords) {
float[] coordinate = null;
int page = 0;
try{
int pageNum = pdfReader.getNumberOfPages();
PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader);
CustomRenderListener renderListener = new CustomRenderListener();
renderListener.setKeyWord(keyWords);
for (page = 1; page <= pageNum; page++) {
renderListener.setPage(page);
pdfReaderContentParser.processContent(page, renderListener);
coordinate = renderListener.getPcoordinate();
if (coordinate != null) break;
}
} catch (IOException e) {
e.printStackTrace();
}
return coordinate;
}
}
pdf
签名帮助类
java
public class CustomRenderListener implements RenderListener{
private float[] pcoordinate = null;
private String keyWord;
private int page;
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public float[] getPcoordinate(){
return pcoordinate;
}
public String getKeyWord() {
return keyWord;
}
public void setKeyWord(String keyWord) {
this.keyWord = keyWord;
}
@Override
public void beginTextBlock() {}
@Override
public void endTextBlock() {}
@Override
public void renderImage(ImageRenderInfo arg0) {}
@Override
public void renderText(TextRenderInfo textRenderInfo) {
String text = textRenderInfo.getText();
if (null != text && text.contains(keyWord)) {
Float boundingRectange = textRenderInfo.getBaseline().getBoundingRectange();
pcoordinate = new float[3];
pcoordinate[0] = boundingRectange.x;
pcoordinate[1] = boundingRectange.y;
pcoordinate[2] = page;
}
}
}
三、总结
简洁、高效、精炼!