突出显示PDF中的单词

我有一个PDF和一些关键字。 我需要的是在PDF中搜索这些关键字,用PDF突出显示它们并保存。 在此之后,我必须在Google文档中查看此PDF,并且应在其中突出显示这些内容。 我必须用Java做到这一点。

我的代码是

package com.hiringsteps.ats.util.pdfclownUtil; import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.pdfclown.documents.Page; import org.pdfclown.documents.contents.ITextString; import org.pdfclown.documents.contents.TextChar; import org.pdfclown.documents.interaction.annotations.TextMarkup; import org.pdfclown.documents.interaction.annotations.TextMarkup.MarkupTypeEnum; import org.pdfclown.files.File; import org.pdfclown.files.SerializationModeEnum; import org.pdfclown.util.math.Interval; import org.pdfclown.util.math.geom.Quad; import org.pdfclown.tools.TextExtractor; import com.hiringsteps.ats.applicant.domain.ApplicantKeyWord; import com.hiringsteps.ats.job.domain.CustomerJobKeyword; public class TextHighlightUtil { private int count; public Collection highlight(String inputPath, String outputPath, Collection customerJobKeywordList ) { Collection applicantKeywordList = new ArrayList(); ApplicantKeyWord applicantKeyword = null; // 1. Open the PDF file! File file; try { file = new File(inputPath); } catch(Exception e) { throw new RuntimeException(inputPath + " file access error.",e); } for(CustomerJobKeyword key : customerJobKeywordList) { applicantKeyword = new ApplicantKeyWord(); count = 0; // Define the text pattern to look for! //String textRegEx = promptChoice("Please enter the pattern to look for: "); applicantKeyword.setKey(key); Pattern pattern = Pattern.compile(key.getName(), Pattern.CASE_INSENSITIVE); // 2. Iterating through the document pages... TextExtractor textExtractor = new TextExtractor(true, true); for(final Page page : file.getDocument().getPages()) { // 2.1. Extract the page text! Map<Rectangle2D,List> textStrings = textExtractor.extract(page); // 2.2. Find the text pattern matches! final Matcher matcher = pattern.matcher(TextExtractor.toString(textStrings)); // 2.3. Highlight the text pattern matches! textExtractor.filter(textStrings, new TextExtractor.IIntervalFilter() { public boolean hasNext() { //if(key.getMatchCriteria() == 1){ if (matcher.find()) { count++; return true; } /*} else if(key.getMatchCriteria() == 2) { if (matcher.hitEnd()) { count++; return true; } }*/ return false; } public Interval next() { return new Interval(matcher.start(), matcher.end()); } public void process(Interval interval, ITextString match) { // Defining the highlight box of the text pattern match... List highlightQuads = new ArrayList(); { Rectangle2D textBox = null; for(TextChar textChar : match.getTextChars()) { Rectangle2D textCharBox = textChar.getBox(); if(textBox == null) {textBox = (Rectangle2D)textCharBox.clone();} else { if(textCharBox.getY() > textBox.getMaxY()) { highlightQuads.add(Quad.get(textBox)); textBox = (Rectangle2D)textCharBox.clone(); } else {textBox.add(textCharBox);} } } textBox.setRect(textBox.getX(), textBox.getY(), textBox.getWidth(), textBox.getHeight()+5); highlightQuads.add(Quad.get(textBox)); } //TextMarkup.setPrintable(true); // Highlight the text pattern match! new TextMarkup(page, MarkupTypeEnum.Highlight, highlightQuads); //TextMarkup temp = new TextMarkup(page, MarkupTypeEnum.Highlight, highlightQuads); //temp.setMarkupBoxes(highlightQuads); //temp.setPrintable(true); // temp.setVisible(true); //temp.setMarkupType(MarkupTypeEnum.Highlight); } public void remove() {throw new UnsupportedOperationException();} } ); } applicantKeyword.setCount(count); applicantKeywordList.add(applicantKeyword); } SerializationModeEnum serializationMode = SerializationModeEnum.Incremental; try { file.save(new java.io.File(outputPath), serializationMode); file.close(); } catch(Exception e) { System.out.println("File writing failed: " + e.getMessage()); e.printStackTrace(); } return applicantKeywordList; } } 

有了这个,我能够突出强调。 但是当我在Google文档中呈现PDF时,这些单词不再突出显示。 如果使用Adobe打开PDF,则会突出显示它们。 此外,如果我只是在Adobe Acrobat Professional中打开并保存PDF,然后使用Google Docs打开它,Google Docs版本将突出显示单词。

也看到了这一点

PDF Clown的作者报告说,问题是由于缺少与标记注释相关联的显式外观流引起的。 如 先前 所述 , 此问题已通过对Sourceforge.net上项目的SVN存储库的修订来解决