File: Watermarker.java

package info (click to toggle)
libitext1-java 1.4-7
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, buster
  • size: 7,636 kB
  • sloc: java: 86,865; xml: 396; makefile: 15
file content (161 lines) | stat: -rw-r--r-- 5,148 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/*
 * $Id: Watermarker.java,v 1.5 2005/11/29 21:05:02 blowagie Exp $
 * $Name:  $
 *
 * This code is free software. It may only be copied or modified
 * if you include the following copyright notice:
 *
 * This class by Carsten hammer and Bruno Lowagie.
 * Copyright (c) 2005 Carsten Hammer and Bruno Lowagie.
 *
 * This code is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *
 * itext-questions@list.sourceforge.net
 */

package com.lowagie.tools.plugins;

import java.io.*;

import javax.swing.*;

import com.lowagie.text.*;
import com.lowagie.text.pdf.*;
import com.lowagie.tools.arguments.*;

/**
 * This tool lets you add a text watermark to all pages of a document.
 */
public class Watermarker extends AbstractTool {
	
	static {
		addVersion("$Id: Watermarker.java,v 1.5 2005/11/29 21:05:02 blowagie Exp $");
	}

	/**
	 * This tool lets you add a text watermark to all pages of a document.
	 */
	public Watermarker() {
		super();
		arguments.add(new FileArgument(this, "srcfile",
				"The file you want to watermark", false, new PdfFilter()));
		arguments.add(new ToolArgument(this, "watermark", "The text that can be used as watermark", String.class.getName()));
		arguments.add(new ToolArgument(this, "fontsize", "The fontsize of the watermark text", String.class.getName()));
		arguments.add(new FileArgument(this, "destfile",
				"The file to which the watermarked PDF has to be written",
				true, new PdfFilter()));

	}

	/**
	 * Creates the internal frame.
	 */
	protected void createFrame() {
		internalFrame = new JInternalFrame("Watermark", true, false, true);
		internalFrame.setSize(300, 80);
		internalFrame.setJMenuBar(getMenubar());
		System.out.println("=== Watermark OPENED ===");
	}

	/**
	 * Executes the tool (in most cases this generates a PDF file).
	 */
	public void execute() {
		try {
			if (getValue("srcfile") == null) {
				throw new InstantiationException(
						"You need to choose a sourcefile");
			}
			if (getValue("destfile") == null) {
				throw new InstantiationException(
						"You need to choose a destination file");
			}
			if (getValue("watermark") == null) {
				throw new InstantiationException(
						"You need to add a text for the watermark");
			}
        	int fontsize = Integer.parseInt((String)getValue("fontsize"));
			BaseFont bf = BaseFont.createFont("Helvetica", BaseFont.WINANSI,
					false);
			PdfReader reader = new PdfReader(((File) getValue("srcfile"))
					.getAbsolutePath());
			int pagecount = reader.getNumberOfPages();
			PdfGState gs1 = new PdfGState();
			gs1.setFillOpacity(0.5f);
			String text = (String)getValue("watermark");
			PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(
					(File) getValue("destfile")));
			float txtwidth = bf.getWidthPoint(text, fontsize);
			for (int i = 1; i <= pagecount; i++) {
				PdfContentByte seitex = stamp.getOverContent(i);
				Rectangle recc = reader.getCropBox(i);
				float winkel = (float) Math.atan(recc.height() / recc.width());
				float m1 = (float) Math.cos(winkel);
				float m2 = (float) -Math.sin(winkel);
				float m3 = (float) Math.sin(winkel);
				float m4 = (float) Math.cos(winkel);
				float xoff = (float) (-Math.cos(winkel) * txtwidth / 2 - Math
						.sin(winkel)
						* fontsize / 2);
				float yoff = (float) (Math.sin(winkel) * txtwidth / 2 - Math
						.cos(winkel)
						* fontsize / 2);
				seitex.saveState();
				seitex.setGState(gs1);
				seitex.beginText();
				seitex.setFontAndSize(bf, fontsize);
				seitex.setTextMatrix(m1, m2, m3, m4, xoff + recc.width() / 2,
						yoff + recc.height() / 2);
				seitex.showText(text);
				seitex.endText();
				seitex.restoreState();
			}
			stamp.close();
		} catch (Exception e) {
			JOptionPane.showMessageDialog(internalFrame, e.getMessage(), e
					.getClass().getName(), JOptionPane.ERROR_MESSAGE);
			System.err.println(e.getMessage());
		}
	}

	/**
	 * Gets the PDF file that should be generated (or null if the output isn't a
	 * PDF file).
	 * 
	 * @return the PDF file that should be generated
	 * @throws InstantiationException
	 */
	protected File getDestPathPDF() throws InstantiationException {
		return (File) getValue("destfile");
	}

	/**
	 * Indicates that the value of an argument has changed.
	 * 
	 * @param arg
	 *            the argument that has changed
	 */
	public void valueHasChanged(ToolArgument arg) {
		if (internalFrame == null) {
			// if the internal frame is null, the tool was called from the
			// commandline
			return;
		}

	}

	/**
	 * This methods helps you running this tool as a standalone application.
	 * @param args the srcfile, watermark text and destfile
	 */
	public static void main(String[] args) {
		Watermarker watermarker = new Watermarker();
    	if (args.length != 4) {
    		System.err.println(watermarker.getUsage());
    	}
    	watermarker.setArguments(args);
        watermarker.execute();
	}
}