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();
}
}
|