java - PDFBox 中的多边形注释 PDAnnotation

标签 java annotations pdfbox

我想在给定坐标处添加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 类型。该版本还将支持外观流的构建,即您将能够使用 Adob​​e 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/

相关文章:

java - TreeMap.containsKey() 中的 Werid ClassCastException

java - 停止播放音频/广播并取消返回主屏幕的通知控制,音乐停止,通知停止,前台服务不起作用

java - 如何通过 bukkit 中的配置添加消息?

java - 调用方法的注解

java - 覆盖交易方法

java - 使用 PDFBOX 合并 PDF 仅在 AWS lambda 上给出暂存文件大小 65536 错误

java - 在 Eclipse 中拼错方法名称后如何恢复自动完成?

java - AnnotatedTypes 是否有类似 TypeToken 的东西

java - 使用 PDFBox 2.0.17 对具有多个签名字段的 PDF 进行签名

android - Android 上的 PDFBox