PDFbox提取pdf页面和矩形的AnnotationLinks。

问题描述 投票:2回答:1

我必须提取PDF文件中链接的页码和坐标。我发现,PDFbox可能是一个工具,我可以使用。然而,我不能找到一个例子代码正是为了这个目的。似乎 PDFTextStripperByArea 被用来提取特定区域内的文本。而我需要的是每个AnnotationLink的页码和矩形作为输出,而不是实际内容(文本)。

以下是我试图基于参考示例创建的Java代码(https:/svn.apache.orgreposasfpdfboxtrunkexamplessrcmainjavaorgapachepdfboxexamplespdmodelPrintURLs.java。).

但是我得到了一个错误信息 "Cannot cast object 'org.apache.pdfbox.pdmodel.PDPageTree@5cad4cc0' with class'org.apache.pdfbox.pdmodel.PDPageTree' to class 'java.util.List'",这让我无法理解。另外,在代码中我使用了 PDAnnotationLink来捕捉AnnotationLinks的矩形,但我不知道如何捕捉每个AnnotationLinks的页码。

谁能给我一些建议来解决这个错误,并帮助检查我的代码? 如果我在这里写了一些愚蠢的代码,请原谅我,因为我不熟悉Java语言。

package org.apache.pdfbox.examples.util; 

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsDevice;
import java.awt.Paint;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.Stroke;
import java.awt.TexturePaint;
import java.awt.Transparency;
import java.awt.geom.AffineTransform;
import java.awt.geom.Area;
import java.awt.geom.GeneralPath;
import java.awt.geom.PathIterator;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Stack;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.pdfbox.contentstream.PDFGraphicsStreamEngine;
import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.cos.COSNumber;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.common.function.PDFunction;
import org.apache.pdfbox.pdmodel.interactive.annotation.AnnotationFilter;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationMarkup;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDBorderStyleDictionary;
import org.apache.pdfbox.util.Matrix;
import org.apache.pdfbox.util.Vector;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage; 
import org.apache.pdfbox.text.TextPosition; 
import org.apache.pdfbox.text.PDFTextStripperByArea;
import org.apache.pdfbox.text.PDFTextStripper; 
import org.apache.pdfbox.pdmodel.PDPageTree;

public class PDRectangle extends PDFTextStripper 
 {
     public PDRectangle() throws IOException 
     { 
     } 

     public static void main( String[] args ) throws IOException 
     {   
         args = new String[1];
         args[0] = "C:/test.pdf";
         if( args.length != 1 ) 
         { 
             usage(); 
         } 
         else 
         { 
             PDDocument document = null; 
             try 
             {   
                 document = PDDocument.load( new File(args[0]) ); 
                 List allPages = document.getDocumentCatalog().getPages();
                 for( int i=0; i<allPages.size(); i++ )
                {
                    PDFTextStripperByArea stripper = new PDFTextStripperByArea();
                    PDPage page = (PDPage)allPages.get( i );
                    List annotations = page.getAnnotations();
                    for( int j=0; j<annotations.size(); j++ )
                    {
                        PDAnnotation annot = (PDAnnotation)annotations.get( j );
                        if( annot instanceof PDAnnotationLink )
                        {
                            PDAnnotationLink link = (PDAnnotationLink)annot;
                            PDRectangle rect = link.getRectangle();
                            float x = rect.getLowerLeftX();
                            float y = rect.getUpperRightY();
                            float width = rect.getWidth();
                            float height = rect.getHeight();
                        }
                        stripper.extractRegions( page );
                   }  
               } 
             }
             finally 
             { 
                 if( document != null ) 
                 { 
                     document.close(); 
                 } 
             } 
         } 
     } 

@Override 
     protected void writeString(String string, List<PDRectangle> PDRectangles) throws IOException 
     { FileWriter myWriter = new FileWriter("C:/test.txt", true);
    BufferedWriter bw = new BufferedWriter(myWriter);
    PrintWriter out = new PrintWriter(bw);
         for (int j=0; j<annotations.size(); j++) 
             {PDAnnotation annot = (PDAnnotation)annotations.get( j );
                        if( annot instanceof PDAnnotationLink )
                 {myWriter.write(rect.getLowerLeftX() + ", " 
                  + rect.getUpperRightY() + ", " + rect.getWidth() + 
                  ", " + rect.getHeight());                         
                   } 
              }
       myWriter.close();        
    } 
private static void usage() 
   { 
System.err.println( "Usage: java " + PDRectangle.class.getName() + " <input-pdf>" 
   ); 
 } 
} 
java pdfbox
1个回答
1
投票

在@TilmanHausherr和@mkl的帮助下,我终于做到了。下面是我用来捕捉我所需要的关键代码。

package org.apache.pdfbox.debugger.PagePane;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Font;
    import java.awt.GraphicsEnvironment;
    import org.apache.pdfbox.pdmodel.PDDocument;
    import org.apache.pdfbox.pdmodel.PDPage;
    import org.apache.pdfbox.rendering.PDFRenderer;
    import org.apache.pdfbox.debugger.PDFDebugger;
    import org.apache.pdfbox.pdmodel.common.PDRectangle;
    import org.apache.pdfbox.pdmodel.interactive.action.PDAction;
    import org.apache.pdfbox.pdmodel.interactive.action.PDActionGoTo;
    import org.apache.pdfbox.pdmodel.interactive.action.PDActionURI;
    import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
    import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink;
    import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget;
    import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDDestination;
    import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDNamedDestination;
    import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDPageDestination;
    import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
    import org.apache.pdfbox.pdmodel.interactive.form.PDField;
    import org.apache.pdfbox.text.PDFTextStripperByArea;

    public class Pagepane {

        public static void main(String... args) throws IOException {
            File file = new File("U:/test/test.pdf");
            PDDocument document = PDDocument.load(file);
                    int pageNum = 0;
                    String Rect = "";
                    FileWriter myWriter = new FileWriter("U:/test/test.txt");
                    BufferedWriter bw = new BufferedWriter(myWriter);
                    PrintWriter out = new PrintWriter(bw);
                    for( PDPage page : document.getPages() )
                    {
                        pageNum++;
                        PDFTextStripperByArea stripper = new PDFTextStripperByArea();
                        List<PDAnnotation> annotations = page.getAnnotations();
                        for( int j=0; j<annotations.size(); j++ )
                          {
                            PDAnnotation annot = annotations.get(j);
                            String field=PDField;
                            if( annot instanceof PDAnnotationLink )
                               {
                                PDAnnotationLink link = (PDAnnotationLink)annot;
                                PDRectangle rect = link.getRectangle();
                                float x1 = rect.getLowerLeftX();
                                float y1 = rect.getUpperRightY();
                                float x2 = x1 + rect.getWidth();
                                float y2 = y1 - rect.getHeight();
                                myWriter.write(pageNum + ", " + x1 + ", " + x2 + ", " + y1 + ", " + y2 + "\r\n");
                               }
                            }                 
                    }
            myWriter.close();        
            document.close();
        }
    }   
© www.soinside.com 2019 - 2024. All rights reserved.