[JAVA] Définir un filigrane à imprimer uniquement lors de l'impression avec iText

Y a-t-il une sortie uniquement lors de l'impression?

Eh bien, il existe une chose telle que PDF. Je comprends, faisons-le. En parlant de PDF, iText. Vous ne pouvez rien faire avec iText. e? Est-il possible de créer un PDF linéarisé? Si vous connaissez ce genre de choses, ne lisez pas cet article.

Eh bien, cela ressemble à ceci sur l'écran des paramètres d'Acrobat. Je vois. Acrobatでの設定画面

D'accord, je l'écrirai tout de suite

Si vous utilisez le japonais, n'oubliez pas ** iTextAsian.jar ** et ** 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();
			
			//Transparence
			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 = "Ne pas sortir";

				val cropBox = reader.getCropBox(page);
				
				cb.beginText();
				cb.setFontAndSize(bf_courier, 20);
				
				//Essayez d'écrire en diagonale à des intervalles appropriés
				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]);
	}
}

Ça ressemble à ça

C'est un peu petit et difficile à voir, mais le filigrane n'a été dessiné que sur l'aperçu avant impression. Eh bien, ça ressemble à ça. wmpdf.png

Recommended Posts

Définir un filigrane à imprimer uniquement lors de l'impression avec iText
Comment définir des variables d'environnement lors de l'utilisation de Payjp avec Rails
Que faire lorsque CentOS ne peut pas être démarré avec VirtualBox sur Catalina
Remarques sur ce qu'il faut faire lorsque EC2 est configuré avec t2.micro
Sortie de l'heure système sur MANIFEST.MF avec Maven
Seuls jusqu'à 100 avertissements javac sont émis.
Comment définir JAVA_HOME avec l'appassembler-maven-plugin de Maven