java - 手绘水墨画未显示在 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.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 的注释部分看到注释和注释,但我看不到页面上的绘图。

提前致谢。

最佳答案

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);

关于java - 手绘水墨画未显示在 pdfbox 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51297982/

相关文章:

java - 如果为同一个 JButton 注册了 2 个 Action 监听器,则在特定条件下阻止执行 listener2

C# 在 List<string> 上设置数据注释

PDFBox 2.0.4 : XFA to text error

java - 为什么 PDFBox 不使用横向打印文档?

java - 查找并替换以新字符串开头和结尾的子字符串 java

java - Java中的装饰器

java - 默认 JAVA,$JAVA_HOME 与 sudo update-alternatives --config java

java - 通过注释快速添加日志记录(例如用于 getter/setter 的 lombok) - 有可用的解决方案吗?

java - Gradle 插件任务反射扫描插件的项目类文件而不是当前项目文件

java - 如何使用 PDFBOX 生成动态页数