我必须提取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>"
);
}
}
在@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();
}
}