我想在给定坐标处添加PDF中的多边形,我引用了这个link用于添加圆形和矩形的注释,但不包含任何多边形的注释。有谁知道该怎么做?或者有谁知道我在哪里可以获得有关 PDFBox 注释的所有文档。
在这里我分享我到目前为止所做的事情。但我无法继续下去。
import java.io.IOException;
import java.io.File;
import java.io.FileReader;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.json.simple.parser.ParseException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.graphics.color.PDColor;
import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
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.PDAnnotationLine;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationText;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationMarkup;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationSquareCircle;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationTextMarkup;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDBorderStyleDictionary;
import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDPageDestination;
import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDPageFitWidthDestination;
public class Polygon{
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
// Loading the PDF File
File file = new File("abc.pdf");
PDDocument document = PDDocument.load(file);
System.out.println("PDF Loaded.");
PDPage page = document.getPage(0);
List<PDAnnotation> polygon = page.getAnnotations();
// Color of polygon
PDColor color = new PDColor(new float[] {0, 0, 1}, PDDeviceRGB.INSTANCE);
// Define border thickness
PDBorderStyleDictionary thickness = new PDBorderStyleDictionary();
thickness.setWidth((float)2);
float[] vertices = {418, 110, 523, 110, 522, 132, 419, 133};
PDAnnotationSquareCircle lines = new PDAnnotationSquareCircle(PDAnnotationSquareCircle.SUB_TYPE_POLYGON);
lines.setColor(color);
lines.setBorderStyle(thickness);
/*****************
*
* ????
* *************************************/
// Save annotations
document.save(file);
// Close document
document.close();
}
}
据我所知,PDAnnotation jar 中没有任何在多边形中添加顶点的方法。那么我们有什么办法可以在这里绘制多边形吗?
谢谢。
最佳答案
下面是一些代码,很快就会从源代码下载中添加到 AddAnnotations.java 示例中:
static final float INCH = 72;
float pw = page1.getMediaBox().getUpperRightX();
float ph = page1.getMediaBox().getUpperRightY();
PDAnnotationMarkup polygon = new PDAnnotationMarkup();
polygon.getCOSObject().setName(COSName.SUBTYPE, PDAnnotationMarkup.SUB_TYPE_POLYGON);
position = new PDRectangle();
position.setLowerLeftX(pw - INCH);
position.setLowerLeftY(ph - INCH);
position.setUpperRightX(pw - 2 * INCH);
position.setUpperRightY(ph - 2 * INCH);
polygon.setRectangle(position);
polygon.setColor(blue); // border color
polygon.getCOSObject().setItem(COSName.IC, red.toCOSArray()); // interior color
COSArray triangleVertices = new COSArray();
triangleVertices.add(new COSFloat(pw - INCH));
triangleVertices.add(new COSFloat(ph - 2 * INCH));
triangleVertices.add(new COSFloat(pw - INCH * 1.5f));
triangleVertices.add(new COSFloat(ph - INCH));
triangleVertices.add(new COSFloat(pw - 2 * INCH));
triangleVertices.add(new COSFloat(ph - 2 * INCH));
polygon.getCOSObject().setItem(COSName.VERTICES, triangleVertices);
polygon.setBorderStyle(borderThick);
annotations.add(polygon);
要调整自己的代码,您需要调整矩形并传递顶点:
position.setLowerLeftX(418);
position.setLowerLeftY(110);
position.setUpperRightX(523);
position.setUpperRightY(133);
polygon.setRectangle(position);
float[] vertices = {418, 110, 523, 110, 522, 132, 419, 133};
COSArray verticesArray = new COSArray();
for (float v : vertices)
verticesArray.add(new COSFloat(v));
polygon.getCOSObject().setItem(COSName.VERTICES, verticesArray);
这仅适用于 2.0。在 3.0 中,将有一个具有适当方法的 PDAnnotationPolygon 类型。该版本还将支持外观流的构建,即您将能够使用 Adobe Reader 之外的其他查看器显示 PDF。大多数观众,例如PDF.js 和 PDFBox 不会构建缺失的外观,因此您什么也看不到。
如果您需要2.0的外观,您可以尝试使用https://issues.apache.org/jira/browse/PDFBOX-3353中的ShowAnnotation-6.java文件中的代码.
要使用 3.0 版本进行测试,请在此处获取 jar: https://repository.apache.org/content/groups/snapshots/org/apache/pdfbox/pdfbox-app/3.0.0-SNAPSHOT/
要构建外观,请调用polygon.constructAppearances();
关于java - PDFBox 中的多边形注释 PDAnnotation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51129509/