java - 手绘墨水绘图未显示在 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);
推荐阅读
- swift - 从核心数据实体中获取对象检索到错误的对象
- javascript - 等待比那时更快吗?
- android - 为什么 putExtra 没有将正确的值从服务传递到活动?
- mxnet - 在 Android 上运行 GluonCV 对象检测模型
- github - 切换分支并仅与您一起进行特定更改
- logging - 在 Grails 中配置日志级别服务器
- c# - Angular Material中asp Listbox类型功能的控件是什么?
- f# - 使用序列表达式时如何处理 F# 中的异常?
- c# - ASP .NET Core OpenID Connect - 在外部登录后发出我自己的 cookie?
- asp.net-core - 在两个不同的 ASP.NET Core Web 应用程序之间共享身份验证 cookie