Простейшим способом, вероятно, является использование Chunk
с общим тегом и PdfPageEvent
. Таким образом, вы получите обратный вызов события, когда Chunk
будет размещен на странице. Обратный вызов даст вам координаты (прямоугольник) Chunk
, что позволит вам нарисовать границу и тень в правильном месте.
Пример такого обработчика событий, чтобы нарисовать черную рамку и серая тень:
class ShadowEvent extends PdfPageEventHelper {
@Override
public void onGenericTag(PdfWriter writer, Document document,
Rectangle rect, String text) {
PdfContentByte canvas = writer.getDirectContent();
// Paddings for the border
int paddingHorizontal = 20;
int paddingVertical = 5;
// Width of the shadow
int shadowwidth = 5;
// Calculate border location and size
float left = rect.getLeft() - paddingHorizontal;
float bottom = rect.getBottom() - paddingVertical;
float width = rect.getWidth() + 2*paddingHorizontal;
float height = rect.getHeight() + 2*paddingVertical;
canvas.saveState();
canvas.setColorFill(BaseColor.GRAY);
// Draw the shadow at the bottom
canvas.rectangle(left + shadowwidth, bottom - shadowwidth, width, shadowwidth);
canvas.fill();
// Draw the shadow at the right
canvas.rectangle(left + width, bottom - shadowwidth, shadowwidth, height);
canvas.fill();
canvas.setColorStroke(BaseColor.BLACK);
// Draw the border
canvas.rectangle(left, bottom, width, height);
canvas.stroke();
canvas.restoreState();
}
}
Это показывает, как использовать общий тег:
Document doc = new Document();
PdfWriter pdfWriter = PdfWriter.getInstance(doc, outfile);
pdfWriter.setPageEvent(new ShadowEvent());
doc.open();
Chunk c = new Chunk("60");
c.setGenericTag("shadow");
doc.add(c);
doc.close();
(Обратите внимание, что параметр text
метода onGenericTag
будет содержать String
, который был установлен на Chunk
с setGenericTag
. Это пример "shadow"
в приведенном выше примере. Он позволяет различать различные теги. . Так как мы просто используем 1 тег здесь, я не использую параметр text
)
Результат примера выглядит следующим образом: