在PDF中突出显示文字

4

我有一个PDF文件和一些关键词。我需要在PDF文件中搜索这些关键词,将它们在PDF中标记并保存。之后,我需要在Google Docs中查看此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<ApplicantKeyWord> highlight(String inputPath, String outputPath, Collection<CustomerJobKeyword> customerJobKeywordList )
        {           
            Collection<ApplicantKeyWord> applicantKeywordList = new ArrayList<ApplicantKeyWord>();
            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<ITextString>> 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<Integer> next()
                      {
                          return new Interval<Integer>(matcher.start(), matcher.end());
                      }

                      public void process(Interval<Integer> interval, ITextString match)
                      {
                        // Defining the highlight box of the text pattern match...
                        List<Quad> highlightQuads = new ArrayList<Quad>();
                        {
                          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文档中打开它,那么Google文档版本将突出显示这些单词。

也可以看看这个


如果您在Adobe中手动突出显示某些内容,那么在Google Docs/Drive中打开它时是否仍然保留着这些高亮显示?(即这是Docs的问题还是您的代码的问题?) - Michael Lloyd Lee mlk
1个回答

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接