title: Highlight words in PDF
body: <p>I have one PDF and some keywords. What I need is to search for those keywords in the PDF, highlight them in PDF, and save it. After this, I have to view this PDF in Google Docs and the words should be highlighted in it. I have to do this in Java.</p>
  
  <p>My code is </p>
  
  <pre><code>    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&lt;ApplicantKeyWord&gt; highlight(String inputPath, String outputPath, Collection&lt;CustomerJobKeyword&gt; customerJobKeywordList )
          {           
              Collection&lt;ApplicantKeyWord&gt; applicantKeywordList = new ArrayList&lt;ApplicantKeyWord&gt;();
              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&lt;Rectangle2D,List&lt;ITextString&gt;&gt; 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&lt;Integer&gt; next()
                        {
                            return new Interval&lt;Integer&gt;(matcher.start(), matcher.end());
                        }
  
                        public void process(Interval&lt;Integer&gt; interval, ITextString match)
                        {
                          // Defining the highlight box of the text pattern match...
                          List&lt;Quad&gt; highlightQuads = new ArrayList&lt;Quad&gt;();
                          {
                            Rectangle2D textBox = null;
                            for(TextChar textChar : match.getTextChars())
                            {
                              Rectangle2D textCharBox = textChar.getBox();
                              if(textBox == null)
                              {textBox = (Rectangle2D)textCharBox.clone();}
                              else
                              {
                                if(textCharBox.getY() &gt; 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;
            }     
  
      }
  </code></pre>
  
  <p>With this, I am able to highlight. But when I render the PDF in Google Docs, the words are no longer highlighted. If the PDF is opened with Adobe, they are highlighted. Also, if I just open and save the PDF in Adobe Acrobat Professional, then open it with Google Docs, the Google Docs version will have the words highlighted.</p>
  
  <p><a href="https://sourceforge.net/projects/clown/forums/forum/607163/topic/4866554" rel="nofollow">See this also</a></p>