首页 > 解决方案 > 手绘墨水绘图未显示在 pdfbox 中

问题描述

我想在 pdf 页面上添加手绘墨水注释。正在添加手绘注释,但它没有显示在 pdf 页面上。我不明白这里有什么问题。我正在分享我已经完成的代码。

import java.io.IOException;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSFloat;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.color.PDColor;
import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationMarkup;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDBorderStyleDictionary;

public class Freehand {

public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub

    File file = new File("C:/Users/sinssb/Documents/07904660.pdf");
    PDDocument document = PDDocument.load(file);
    System.out.println("PDF loaded.");

    try {
        PDPage page = document.getPage(0);
        List<PDAnnotation> annotations = page.getAnnotations();
        PDColor color = new PDColor(new float[] {0, 0, 1}, PDDeviceRGB.INSTANCE);
        PDBorderStyleDictionary thickness = new PDBorderStyleDictionary();
        thickness.setWidth((float)2);

        PDAnnotationMarkup freehand = new PDAnnotationMarkup();
        freehand.getCOSObject().setName(COSName.SUBTYPE, PDAnnotationMarkup.SUB_TYPE_INK);
        freehand.setColor(color);
        freehand.setBorderStyle(thickness);

        float[] coordinates = new float[] {86,140,85,140,83,140,81,139,79,137,76,135,73,133,71,131,69,129,68,127,67,125,67,123,67,122,67,120,67,119,67,116}; 
        PDRectangle points = new PDRectangle();

        float[] allX = new float[coordinates.length / 2];
        float[] allY = new float[coordinates.length / 2];

        int k = 0, l = 0;
        for (int j = 0; j < coordinates.length; j++) {
            if (j % 2 == 0) {
                allX[k] = coordinates[j];
                k++;
            }
            else {
                allY[l] = coordinates[j];
                l++;
            }               
        }

        Arrays.sort(allX);
        Arrays.sort(allY);

        float smallestX = allX[0];
        float smallestY = allY[0];
        float largestX = allX[allX.length - 1];
        float largestY = allY[allY.length - 1];

        points.setLowerLeftX(smallestX);
        points.setLowerLeftY(smallestY);
        points.setUpperRightX(largestX);
        points.setUpperRightY(largestY);
        freehand.setRectangle(points);
        System.out.println(points);
        freehand.setContents("Hello");

        COSArray verticesArray = new COSArray();

        for (int i = 0; i < coordinates.length; i++) {
            verticesArray.add(new COSFloat(coordinates[i]));
        }

        freehand.getCOSObject().setItem(COSName.INKLIST, verticesArray);
        annotations.add(freehand);
        System.out.println("Freehand is added.");
    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }

    // Save the file
    document.save(file);

    // Close the document
    document.close();
}

}

此代码添加了注释,因为我可以在 Acrobat Reader 的注释部分看到注释和注释,但我看不到页面上的绘图。

在此先感谢。

标签: javaannotationspdfbox

解决方案


inklist 是一个数组数组(因为一个注释可以有几行),所以像这样更改您的代码:

COSArray verticesArray = new COSArray();

for (int i = 0; i < coordinates.length; i++) {
    verticesArray.add(new COSFloat(coordinates[i]));
}

// new / changed
COSArray verticesArrayArray = new COSArray();
verticesArrayArray.add(verticesArray);
freehand.getCOSObject().setItem(COSName.INKLIST, verticesArrayArray);

推荐阅读