![](/img/trans.png)
[英]Extract Multiple Embedded Images from a single PDF Page using PDFBox
[英]PDFbox to extract pdf page and rectangle of AnnotationLinks
我必须提取 PDF 文件中链接的页码和坐标。 我发现 PDFbox 可能是我可以使用的工具。 但是,我找不到完全用于此目的的示例代码。 似乎PDFTextStripperByArea
用于提取特定区域内的文本。 虽然我需要的是每个 AnnotationLink 的页码和矩形为 output,而不是实际内容(文本)。
Here is the Java code I tried to create based on the reference example( https://svn.apache.org/repos/asf/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel /PrintURLs.java )。
But I got an error message "Cannot cast object 'org.apache.pdfbox.pdmodel.PDPageTree@5cad4cc0' with class 'org.apache.pdfbox.pdmodel.PDPageTree' to class 'java.util.List'" which I cannot understand . 另外,在代码中我使用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();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.