Java 未在pdfbox中显示徒手墨迹图形

Java 未在pdfbox中显示徒手墨迹图形,java,annotations,pdfbox,Java,Annotations,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

我想在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();
}

}
import java.io.IOException;
导入java.io.File;
导入java.util.array;
导入java.util.List;
导入org.apache.pdfbox.cos.COSArray;
导入org.apache.pdfbox.cos.COSFloat;
导入org.apache.pdfbox.cos.COSName;
导入org.apache.pdfbox.pdmodel.PDDocument;
导入org.apache.pdfbox.pdmodel.PDPage;
导入org.apache.pdfbox.pdmodel.common.PDRectangle;
导入org.apache.pdfbox.pdmodel.graphics.color.PDColor;
导入org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
导入org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
导入org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationMarkup;
导入org.apache.pdfbox.pdmodel.interactive.annotation.PDBorderStyleDictionary;
公共级写意{
公共静态void main(字符串[]args)引发IOException{
//TODO自动生成的方法存根
File File=新文件(“C:/Users/sinssb/Documents/07904660.pdf”);
PDDocument document=PDDocument.load(文件);
System.out.println(“PDF加载”);
试一试{
PDPage page=document.getPage(0);
列表注释=page.getAnnotations();
PDColor color=newpdcolor(newfloat[]{0,0,1},PDDeviceRGB.INSTANCE);
PDBorderStyleDictionary厚度=新PDBorderStyleDictionary();
厚度。设置宽度((浮动)2);
PDAnnotationMarkup freehand=新的PDAnnotationMarkup();
freehand.getCOSObject().setName(COSName.SUBTYPE,PDAnnotationMarkup.SUB_TYPE_INK);
写意。设置颜色(颜色);
写意风格(厚度);
float[]坐标=新的float[]{86140,85140,83140,81139,79137,76135,73133,71131,69129,68127,67125,67123,67122,67120,67119,67116};
PDRectangle points=新的PDRectangle();
float[]allX=新的float[coordinates.length/2];
float[]allY=新的float[coordinates.length/2];
int k=0,l=0;
对于(int j=0;j
这段代码添加了注释,因为我可以在Acrobat Reader的“注释”部分看到注释和注释,但我看不到页面上的图形


提前感谢。

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);
COSArray-verticesArray=new-COSArray();
对于(int i=0;i
(很抱歉,如果我在以前的评论或聊天中给了您不完整或错误的信息,我记得您不久前问过我有关ink annotation的问题)它成功了!!!!谢谢不用担心,我不知道这个“数组数组”和引起问题的原因。:-)我已经使用setContents()方法将注释添加到注释中,但我想添加对该注释的一系列回复,并且我想在注释顶部显示作者姓名,这在PDFBox中可能吗?似乎是非正式的。。。/T条目在我的示例文件中包含作者。因此,请尝试
freehand.getCOSObject().setString(COSName.T,“Suhas”)
对于响应,请使用
setInReplyTo
setReplyType
。这仅适用于标记注释。