Я адаптировал ваш пример для Java, но это не должно иметь большого значения, поскольку важна математика:
public static final String SRC = "src/main/resources/pdfs/hello.pdf";
public static final String DEST = "results/text/watermark.pdf";
public static final String IMG = "src/main/resources/img/mascot.png";
public static void main(String[] args) throws IOException {
File file = new File(DEST);
file.getParentFile().mkdirs();
new Watermark().createPdf(SRC, DEST);
}
public void createPdf(String src, String dest) throws IOException {
PdfDocument pdfDoc = new PdfDocument(
new PdfReader(src), new PdfWriter(dest));
Document document = new Document(pdfDoc);
PdfCanvas over;
PdfExtGState gs1 = new PdfExtGState();
gs1.setFillOpacity(0.5f);
int n = pdfDoc.getNumberOfPages();
Rectangle pagesize;
ImageData img = ImageDataFactory.create(IMG);
float iW = img.getWidth();
float iH = img.getHeight();
float pW, pH, sW, sH, f, x, y;
for (int i = 1; i <= n; i++)
{
PdfPage pdfPage = pdfDoc.getPage(i);
pagesize = pdfPage.getPageSize();
pW = pagesize.getWidth();
pH = pagesize.getHeight();
f = (pW / iW) * 0.5f;
sW = iW * f;
sH = iH * f;
x = pagesize.getLeft() + (pW / 2) - (sW / 2);
y = pagesize.getBottom() + (pH / 2) - (sH / 2);
over = new PdfCanvas(pdfDoc.getPage(i));
over.saveState();
over.setExtGState(gs1);
over.addImage(img, sW, 0, 0, sH, x, y);
over.restoreState();
}
document.close();
pdfDoc.close();
}
Результат этого кода выглядит следующим образом:
![enter image description here](https://i.stack.imgur.com/hyHXj.png)
Это выглядит именно так, как я этого ожидаю.
Некоторое объяснение.
- У меня есть изображение
mascot.png
с размерами iW
x iH
.
- У меня есть страницы с размерами
pW
x pH
.
- Я хочу масштабировать изображение так, чтобы оно занимало 50% ширины, поэтому я создаю переменную
f
со значением 0.5f
(50%) x `` (pW / iW) `.
- Я применяю коэффициент
f
к начальным значениям изображений, что приводит к масштабным размерам sW
x sH
.
- Я определяю смещение для изображения
(x, y)
, вычитая половину масштабированной ширины и высоты середины страницы.
Теперь у меня есть значения, необходимые для метода addImage()
: over.addImage(img, sW, 0, 0, sH, x, y);
Примечание. Вы добавляли изображения как встроенное изображение . Это плохая идея, потому что это приводит к раздутым файлам PDF, особенно в случае водяных знаков. Добавляя изображение в качестве встроенного изображения на каждую страницу, вы добавляете изображения в байтах избыточно столько раз, сколько страниц. Гораздо лучше добавить изображение в качестве объекта XObject. В этом случае байты изображения будут добавлены в документ только один раз, независимо от того, сколько раз вы используете одно и то же изображение. Удалите значение true
из параметров метода addImage()
(укажите до и после PDF и сравните размер файла, чтобы понять, что я имею в виду).