Markieren Sie Wörter in PDF

Ich habe ein PDF und einige Stichwörter. Ich muss nach diesen Stichwörtern im PDF suchen, sie im PDF markieren und speichern. Danach muss ich dieses PDF in Google Text & Tabellen anzeigen und die Wörter sollten darin hervorgehoben werden. Ich muss das in Java machen.

Mein Code ist

    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;
          }     

    }

Damit kann ich hervorheben. Beim Rendern der PDF-Datei in Google Text & Tabellen werden die Wörter jedoch nicht mehr hervorgehoben. Wenn die PDF-Datei mit Adobe geöffnet wird, werden sie hervorgehoben. Wenn ich die PDF-Datei nur in Adobe Acrobat Professional öffne und speichere und sie dann mit Google Text & Tabellen öffne, werden die Wörter in der Google Text & Tabellen-Version hervorgehoben.

Siehe das auch

Antworten auf die Frage(1)

Ihre Antwort auf die Frage