iText 인쇄 시에만 출력되는 워터마크 설정

11446 단어 JavaiText
※ 20.9.25 추가
iText2.1.7은 LGPL인데 자꾸 허가증이 의심스러워요.보도 내용은 iText5 이후에도 사용될 수 있기 때문에 기술 정보로 남겨두지만, 허가증 같은 것을 잘 조사한 후 잊지 않도록 주의하세요.

인쇄할 때만 출력이 있습니까?


아, PDF에도 이런 게 있구나.알았어, 해.PDF면 iText입니다.iText로 할 수 없는 일은 없다.예?PDF를 선형화할 수 있습니까?이런 거 알면 이런 기사 읽지 마세요.
정말 Acrobat 설정화면에서는 이런 느낌이네요.그렇구나.

그래, 내가 곧 쓸게


그럼 일본어로 iText Asian.jar 및 iText Assian Cmaps.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);

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

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

                layer.setOnPanel(true);

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

                val transparent = new PdfGState();

                // 透明度
                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 = "持ち出し禁止";

                    val cropBox = reader.getCropBox(page);

                    cb.beginText();
                    cb.setFontAndSize(bf_courier, 20);

                    // 斜めに適当な間隔で書いてみる
                    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]);
    }
}

이렇게 된 느낌.


조금 얕보아 잘 모르겠지만 인쇄 미리보기에 워터마크만 그렸다.
뭐, 아마 이런 느낌일 거야.

좋은 웹페이지 즐겨찾기