Многоугольная аннотация в PDFBox PDAnnotation - PullRequest
0 голосов
/ 02 июля 2018

Я хочу добавить многоугольник в PDF в заданных координатах, я сослался на эту ссылку для добавления аннотации круга и прямоугольника, но он не содержит ничего для многоугольника. кто нибудь знает как это сделать? Или кто-нибудь знает, где я могу получить всю документацию об аннотации 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 нет метода добавления вершин в многоугольник. Так есть ли способ нарисовать многоугольник здесь?

Спасибо.

1 Ответ

0 голосов
/ 03 июля 2018

Вот некоторый код, который скоро будет добавлен в пример 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 с соответствующими методами. Эта версия также будет поддерживать создание потоков внешнего вида, то есть вы сможете показывать PDF-файлы другим пользователям, кроме Adobe Reader. Большинство зрителей, например PDF.js и PDFBox не создают недостающие изображения, поэтому вы ничего не увидите.

Если вам нужен внешний вид для 2.0, вы можете попробовать с кодом в файле ShowAnnotation-6.java в https://issues.apache.org/jira/browse/PDFBOX-3353.

Для тестирования с версией 3.0, получите jar здесь: https://repository.apache.org/content/groups/snapshots/org/apache/pdfbox/pdfbox-app/3.0.0-SNAPSHOT/

Чтобы построить внешний вид, звоните polygon.constructAppearances();

...