(Этот ответ основан на коде в редакции 3 вашего вопроса , поскольку изменения в редакции 4 привели к нескольким ошибкам.)
Ваш код создает недопустимый поток появления аннотации:
CBorder cborder = new CBorder(app, 1, 1, annotRect);
cborder.createCloudyRectangle(null);
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();
Его верхняя часть создает путь:
2 j
121.58 588.63 m
122.06 588.95 122.6 589.18 123.16 589.3 c
120.73 588.78 119.18 586.4 119.7 583.96 c
120.19 581.67 122.35 580.14 124.68 580.44 c
...
122.06 596.42 122.6 596.64 123.16 596.76 c
121.09 596.32 119.6 594.49 119.6 592.36 c
119.6 590.87 120.34 589.47 121.58 588.63 c
h
Тогда app.rectangle(cborder.getBBox())
ничего не создает (будьте осторожны, эта перегрузка rectangle
не соответствует ожидаемой цели!).
Затем app.transform(cborder.getMatrix())
добавляет изменение в текущую матрицу преобразования, app.setColorStroke(BaseColor.RED)
добавляет изменение цвета обводки, а app.setLineWidth(1)
добавляет изменение ширины линии:
1 0 0 1 -118.68 -579.48 cm
1 0 0 RG
1 w
И наконец app.stroke()
добавляет команду для обводки пути:
S
Но между определением пути и соответствующей командой рисования пути разрешены только инструкции обтравочного контура! Ср Рисунок 9 - Графические объекты - в спецификации PDF ISO 32000-1.
Вы можете исправить этот код следующим образом, перетаскивая изменения цвета и ширины линии и непосредственно используя ограничивающую рамку облака:
// Create cloud appearance
app.setColorStroke(BaseColor.RED);
app.setLineWidth(1);
CBorder cborder = new CBorder(app, 1, 1, annotRect);
cborder.createCloudyRectangle(null);
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.stroke();
app.setBoundingBox(cborder.getBBox());
( CloudBoxAnnotation тест testDrawLikeChitgoksImproved
)
Это, в частности, меняет результат (как видно из Adobe Acrobat) с
до