По вопросам, подобным этому, обратитесь к The Best iText Questions on StackOverflow. В этой книге собраны сотни ранее заданных вопросов и ответы на StackOverflow, в том числе ответы от нашего закрытого трекера. Это такой ответ, который ранее не публиковался в StackOverflow:
Если у вас непрозрачные фигуры в PDF (например, изображения, но также и цветные фигуры), вам нужно добавить водяной знак поверх существующего содержимого:
PdfContentByte canvas = pdfStamper.getOverContent(i);
Теперь текст будет охватывать изображения, но может скрыть важную информацию. Если вы хотите этого избежать, вам необходимо внедрить прозрачность.
Я написал простой пример, который показывает, как это делается. Это называется TransparentWatermark Давайте посмотрим на результат:
Сначала я добавить текст «Этот водяной знак будет добавлен в существующий контент» в рамках существующего контента. Часть текста скрыта (как вы указываете в своем вопросе). Затем я добавляю текст «Этот водяной знак добавляется поверх существующего контента» поверх существующего содержимого. Этого может быть достаточно, если вы не боитесь, что какая-то важная информация будет потеряна, покрывая существующий контент. В этом случае, посмотрите на то, как я могу добавить текст «Этот ПРОЗРАЧНЫЙ добавляется водяной знак в верхней части существующего контента»:
public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
PdfReader reader = new PdfReader(src);
int n = reader.getNumberOfPages();
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
PdfContentByte under = stamper.getUnderContent(1);
Font f = new Font(FontFamily.HELVETICA, 15);
Phrase p = new Phrase(
"This watermark is added UNDER the existing content", f);
ColumnText.showTextAligned(under, Element.ALIGN_CENTER, p, 297, 550, 0);
PdfContentByte over = stamper.getOverContent(1);
p = new Phrase("This watermark is added ON TOP OF the existing content", f);
ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, 297, 500, 0);
p = new Phrase(
"This TRANSPARENT watermark is added ON TOP OF the existing content", f);
over.saveState();
PdfGState gs1 = new PdfGState();
gs1.setFillOpacity(0.5f);
over.setGState(gs1);
ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, 297, 450, 0);
over.restoreState();
stamper.close();
reader.close();
}
Некоторые дополнительные советы и приемы:
- Всегда используйте
saveState()
и restoreState()
при изменении состояния графики. Если вы этого не сделаете, вы можете получить нежелательные эффекты, такие как другой контент, на который влияют сделанные вами изменения (например, вы не хотите, чтобы все содержимое стало прозрачным).
- Режим рендеринга по умолчанию «fill», поэтому я изменяю непрозрачность заполнения.
- В этом случае я определил непрозрачность заполнения 50% (0,5f). Выберите любое значение между 0.0f и 1.0f, если вы хотите изменить прозрачность текста.
Зачем этот вопрос? Это настоящая проблема. Конечно, не было образца кода, но образцы кода находятся в другом вопросе. –