[JAVA] Legen Sie ein Wasserzeichen fest, das nur beim Drucken mit iText ausgegeben werden soll

Wird nur beim Drucken ausgegeben?

Nun, es gibt so etwas wie PDF. Ich verstehe, lass es uns schaffen. Apropos PDF, iText. Mit iText können Sie nichts anfangen. e? Ist es möglich, ein linearisiertes PDF zu erstellen? Wenn Sie so etwas wissen, lesen Sie diesen Artikel nicht.

Auf dem Bildschirm mit den Acrobat-Einstellungen sieht es so aus. Aha. Acrobatでの設定画面

Okay, ich werde es sofort schreiben

Wenn Sie Japanisch verwenden, vergessen Sie nicht ** iTextAsian.jar ** und ** iTextAsianCmaps.jar **.

Watermark.java


import java.awt.Color;
import java.io.FileOutputStream;
import java.util.stream.IntStream;

import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfGState;
import com.lowagie.text.pdf.PdfLayer;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;

import lombok.val;

public class Watermark {

	public static void draw(String src, String dest) {
		try {
			val reader = new PdfReader(src);

			val stamp = new PdfStamper(reader, new FileOutputStream(dest));

			val layer = new PdfLayer("watermark", stamp.getWriter());

			layer.setOnPanel(true);

			layer.setOn(false);
			layer.setPrint("Watermark", true);
			layer.setView(false);

			val transparent = new PdfGState();
			
			//Transparenz
			transparent.setStrokeOpacity(0.3f);
			transparent.setFillOpacity(0.3f);

			val bf_courier = BaseFont.createFont("HeiseiKakuGo-W5", "UniJIS-UCS2-H", BaseFont.NOT_EMBEDDED);

			IntStream.rangeClosed(1, stamp.getReader().getNumberOfPages()).forEach(page-> {

				val cb = stamp.getOverContent(page);

				cb.setColorFill(Color.RED);

				cb.beginLayer(layer);
				cb.setGState(transparent);

				val watermarkText = "Nicht herausnehmen";

				val cropBox = reader.getCropBox(page);
				
				cb.beginText();
				cb.setFontAndSize(bf_courier, 20);
				
				//Versuchen Sie, in angemessenen Abständen diagonal zu schreiben
				for(int x = 0; x < cropBox.getWidth(); x += 100) {
					for(int y = 0; y < cropBox.getHeight(); y += 100) {
						cb.showTextAligned(PdfContentByte.ALIGN_CENTER, watermarkText, x, y, 45);
					}
				}
				
				cb.endText();

				cb.endLayer();
			});

			stamp.close();
		} 
		catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {

		if (args.length < 2) {
			System.out.println("Usage: Watermark src.pdf dest.pdf");
			return;
		}

		Watermark.draw(args[0], args[1]);
	}
}

Es sieht aus wie das

Es ist etwas klein und schwer zu sehen, aber das Wasserzeichen wurde nur in der Druckvorschau gezeichnet. Nun, es sieht so aus. wmpdf.png

Recommended Posts

Legen Sie ein Wasserzeichen fest, das nur beim Drucken mit iText ausgegeben werden soll
Festlegen von Umgebungsvariablen bei Verwendung von Payjp mit Rails
Was tun, wenn CentOS nicht mit VirtualBox unter Catalina gestartet werden kann?
Hinweise zur Vorgehensweise bei der Einrichtung von EC2 mit t2.micro
Systemzeit mit Maven an MANIFEST.MF ausgeben
Es werden nur bis zu 100 Javac-Warnungen ausgegeben.
So setzen Sie JAVA_HOME mit dem Appassembler-Maven-Plugin von Maven