【发布时间】:2019-05-31 03:03:07
【问题描述】:
这是我绘制框云注释的示例代码。我在 PDFBox 的实现中使用了代码来绘制一个盒子云,但是在 iText 中使用时我遇到了一个小问题。我修改了边框类和一些部分以在 iText 中使用。
你可以找到边框类here。
我的问题是,没有绘制顶部和右侧的边界云。似乎它们的位置超出了矩形差异。我认为问题在于在 cloudyPolygonImpl() 中绘制曲线。也许itext有不同的方式来绘制PdfAppearance?我不确定。
public class Test {
public static void main(String[] args) throws Exception {
PdfReader reader = new PdfReader("src.pdf");
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("result.pdf"));
PdfDictionary be = new PdfDictionary();
be.put(PdfName.S, PdfName.C);
be.put(PdfName.I, new PdfNumber(1));
Rectangle location = new Rectangle(123.6f, 584.4f, 252.6f, 653.4f);
PdfAnnotation stamp = PdfAnnotation.createSquareCircle(stamper.getWriter(), location, "", true);
stamp.setBorderStyle(new PdfBorderDictionary(1, PdfBorderDictionary.STYLE_SOLID));
stamp.put(new PdfName("BE"), be);
stamp.setColor(BaseColor.RED);
PdfContentByte cb = stamper.getOverContent(1);
PdfAppearance app = cb.createAppearance(location.getWidth(), location.getHeight());
stamp.setAppearance(PdfName.N, app);
PdfArray stickyRect = stamp.getAsArray(PdfName.RECT);
Rectangle annotRect = new Rectangle(stickyRect.getAsNumber(0).floatValue(),
stickyRect.getAsNumber(1).floatValue(),
stickyRect.getAsNumber(2).floatValue(),
stickyRect.getAsNumber(3).floatValue());
PdfArray arrDiff = annotation.getAsArray(PdfName.RD);
Rectangle annotRectDiff = null;
if (arrDiff != null) {
annotRectDiff = new Rectangle(arrDiff.getAsNumber(0).floatValue(), arrDiff.getAsNumber(1).floatValue(),
arrDiff.getAsNumber(2).floatValue(), arrDiff.getAsNumber(3).floatValue()
}
// Create cloud appearance
CBorder cborder = new CBorder(app, 1, 1, annotRect);
cborder.createCloudyRectangle(annotRectDiff);
stamp.put(PdfName.RECT, new PdfRectangle(cborder.getRectangle()));
stamp.put(PdfName.RD, new PdfArray(new float[] {
cborder.getRectDifference().getLeft(),
cborder.getRectDifference().getBottom(),
cborder.getRectDifference().getRight(),
cborder.getRectDifference().getTop() }));
app.rectangle(cborder.getBBox());
app.transform(cborder.getMatrix());
app.setColorStroke(BaseColor.RED);
app.setLineWidth(1);
app.stroke();
stamper.addAnnotation(stamp, 1);
stamper.close();
reader.close();
}
}
正确的输出应该是所有边框都用云绘制,但目前只绘制了左侧和底部。
【问题讨论】:
-
您调用了
cborder.createCloudyRectangle(null);,而 PDFBox PDSquareAppearanceHandler.java 调用了cloudyBorder.createCloudyRectangle(annotation.getRectDifference());。 PDFBox 还会在云完成后修改注释矩形。 (Adobe Reader 也做这个 IIRC) -
你好,蒂尔曼。是的。正在试验代码,但结果是相同的,因为 getRectDifference() 即使在 pdfbox 中也返回 null,即使我使用该方法而不是 null,结果外观也是一样的。我会改回代码。
-
@TilmanHausherr 矩形值与 PDFBox 中的值相同。我认为问题可能在边界类的 cloudyPolygonImpl() 内。它在 iText 中的绘制方式可能有所不同。
-
你最近的编辑很奇怪,它引入了一个新变量
annotation,它在任何地方都没有定义,新的if (arrDiff != null)块中的代码在语法上被破坏了。因此,我将根据原始代码进行回答。 -
顺便说一句:您的代码似乎存在页面旋转 90° 或 270° 的问题...
标签: annotations itext cloud pdf-generation