本片文章主要讲述的是如何设置印章图片,主要讲述的是如何使用关键字定位。主要采用的是PdfTextExtractor.getTextFromPage 方法来获取pdf内容,并通过事件监听器实时当前解析值,并通过字符串比较来获取关键字的定位。多页的情况需要遍历到每个页面。
/**
* 根据关键字查询 关键字位置
*/
private static List<PdfPositon> getKeyWordPosition(List<PdfPositon> pdfPositons, PdfDocument pdf) {
if (pdfPositons == null && pdfPositons.size() == 0) {
return pdfPositons;
}
//检索出是关键字定位的文章
List<PdfPositon> keyWordPositions = new ArrayList<>();
for (PdfPositon pdfPositon : pdfPositons) {
if (PositionTypeEnum.KEYWORD_POSITION.getCode() == pdfPositon.getType()) {
keyWordPositions.add(pdfPositon);
}
}
if (keyWordPositions.isEmpty()) {
return pdfPositons;
}
KeyWordIEventFilter keyWordIEventFilter = new KeyWordIEventFilter(keyWordPositions);
ITextExtractionStrategy textExtractionStrategy = new FilteredTextEventListener(
new LocationTextExtractionStrategy(), keyWordIEventFilter);
for (int i = 1; i <= pdf.getNumberOfPages(); i++) {
keyWordIEventFilter.setPageNo(i);
PdfTextExtractor.getTextFromPage(pdf.getPage(i), textExtractionStrategy);
}
return pdfPositons;
}
主要实现了IEventFillter接口,accept得到的结果是一个字符,不是一行数据,所以需要和关键词一个一个的比对
public class KeyWordIEventFilter implements IEventFilter {
private List<PdfPositon> pdfPositons;
private int[] keywordCursors;
private int pageNo = 1;
public KeyWordIEventFilter(List<PdfPositon> pdfPositons) {
this.pdfPositons = pdfPositons;
this.keywordCursors = new int[pdfPositons.size()];
}
@Override
public boolean accept(IEventData data, EventType type) {
if (type.equals(EventType.RENDER_TEXT) && pdfPositons != null && pdfPositons.size() > 0) {
TextRenderInfo renderInfo = (TextRenderInfo) data;
dealWithKeyWord(renderInfo, pdfPositons);
}
return true;
}
private void dealWithKeyWord(TextRenderInfo renderInfo, List<PdfPositon> pdfPositons) {
char charWord = renderInfo.getText().charAt(0);
for (int i = 0; i < pdfPositons.size(); i++) {
PdfPositon pdfPositon = pdfPositons.get(i);
int keywordCursor = keywordCursors[i];
char[] keyWords = pdfPositon.getKeyWord().toCharArray();
if (keywordCursor == keyWords.length) {
Rectangle rectangle = renderInfo.getBaseline().getBoundingRectangle();
pdfPositon.setPageNo(pageNo);
pdfPositon.setPosX(rectangle.getX());
pdfPositon.setPosY(rectangle.getY());
keywordCursors[i] = 0;
continue;
}
if (charWord == keyWords[keywordCursor]) {
keywordCursors[i] = ++keywordCursor;
} else {
keywordCursors[i] = 0;
}
}
}
public List<PdfPositon> getPdfPositons() {
return pdfPositons;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
}
暂时想到的就是这种方式查找关键词