float zoom = 1.25f;
@SuppressWarnings("unchecked")
public PDFHighlightImage call() throws Exception {
PdfDecoder pdf = new PdfDecoder();
PdfDecoder.setFontReplacements(pdf);
pdf.openPdfFile(pdfFile.toString());
pdf.setPageParameters(zoom, pageNum);
pdf.decodePage(pageNum);
BufferedImage pdfImage = pdf.getPageAsImage(pageNum);
PdfGroupingAlgorithms grouping = pdf.getGroupingObject();
PdfPageData page = pdf.getPdfPageData();
int x1 = page.getMediaBoxX(pageNum);
int x2 = page.getMediaBoxWidth(pageNum);
int y1 = page.getMediaBoxY(pageNum);
int y2 = page.getMediaBoxHeight(pageNum);
final SearchListener listener = new DefaultSearchListener();
List<Rectangle> highlights = grouping.findMultipleTermsInRectangle(
x1, y1, x2, y2,
page.getRotation(pageNum),
pageNum,
highlightTerms,
true, SearchType.DEFAULT, listener);
List<Rectangle> rectangles = new Vector<Rectangle>();
for (Rectangle r: highlights) {
int rX = Math.round((r.x - x1) * zoom);
// 0.25f is to account for descender height, which JPedal does not seem to do
int rY = Math.round((y2 - r.y - r.height + y1 + r.height * 0.2f) * zoom);
int rW = Math.round(r.width * zoom);
int rH = Math.round(r.height * zoom);
Rectangle pdfR = new Rectangle(rX, rY, rW, rH);
rectangles.add(pdfR);
}
pdf.closePdfFile();
pdf = null;
return new PDFHighlightImage(pdfImage, rectangles, pageNum);
}