如何在java中使用itext 2.1.7向TIFF图像添加水印
我想打印带有水印的tiff图像。因此,首先我将tiff图像转换为pdf并将水印添加到生成的pdf中。但水印不会出现在最终的pdf中。是否建议打印带有水印的tiff图像。任何帮助都将不胜感激。这是我的密码如何在java中使用itext 2.1.7向TIFF图像添加水印,java,itext,watermark,Java,Itext,Watermark,我想打印带有水印的tiff图像。因此,首先我将tiff图像转换为pdf并将水印添加到生成的pdf中。但水印不会出现在最终的pdf中。是否建议打印带有水印的tiff图像。任何帮助都将不胜感激。这是我的密码 public class TiffToPdf { private static int TEXT_TILT_ANGLE = 25; private static Color MEDIUM_GRAY = new Color(242,17,72); private static int PRIMAR
public class TiffToPdf {
private static int TEXT_TILT_ANGLE = 25;
private static Color MEDIUM_GRAY = new Color(242,17,72);
private static int PRIMARY_FONT_SIZE = 50;
private static String tif = "C:/Sample.tif";
private static String pdf = "C:/Sample.pdf";
private static String watermarkpdf = "C:/Watermark.pdf"
public static void main(String[] args) throws Exception {
convert(tif, pdf);
File watermark = new File(watermarkpdf);
OutputStream outputStream = new FileOutputStream(watermark);
addWaterMark(pdf, outputStream, "This is Sample WaterMark");
}
public static File convert(String tif, String pdf) {
File pdfFile = null;
String imgeFilename = tif;
Document document = new Document();
try {
PdfWriter writer = PdfWriter.getInstance(
document,
new FileOutputStream(pdf));
writer.setStrictImageSequence(true);
Image image;
document.open();
RandomAccessFileOrArray ra = new RandomAccessFileOrArray(imgeFilename);
int pagesTif = TiffImage.getNumberOfPages(ra);
for (int i = 1; i <= pagesTif; i++) {
image = TiffImage.getTiffImage(ra, i);
image.scaleAbsolute(PageSize.A4.getWidth(), PageSize.A4.getHeight());
document.setMargins(0, 0, 0, 0);
document.newPage();
document.add(image);
}
pdfFile = new File(pdf);
document.close();
} catch (Exception ex) {
//do nothing
}
return pdfFile;
}
public static void addWaterMark(String pdfFile,OutputStream outputStream, String watermark) throws Exception{
PdfReader reader = new PdfReader(pdfFile);
int numPages = reader.getNumberOfPages();
// Create a stamper that will copy the document to the output
// stream.
PdfStamper stamp = new PdfStamper(reader, outputStream);
int page=1;
BaseFont baseFont =
BaseFont.createFont(BaseFont.HELVETICA_BOLDOBLIQUE,
BaseFont.WINANSI, BaseFont.EMBEDDED);
float width;
float height;
while (page <= numPages) {
PdfContentByte cb = stamp.getOverContent(page);
height = reader.getPageSizeWithRotation(page).getHeight() / 2;
width = reader.getPageSizeWithRotation(page).getWidth() / 2;
cb = stamp.getUnderContent(page);
cb.saveState();
cb.setColorFill(MEDIUM_GRAY);
// Primary Text
cb.beginText();
cb.setFontAndSize(baseFont, PRIMARY_FONT_SIZE);
cb.showTextAligned(Element.ALIGN_CENTER, watermark, width,
height, TEXT_TILT_ANGLE);
cb.endText();
cb.restoreState();
page++;
}
stamp.close();
}
公共类TiffToPdf{
专用静态int TEXT_TILT_ANGLE=25;
私有静态颜色中灰色=新颜色(242,17,72);
私有静态int PRIMARY\u FONT\u SIZE=50;
私有静态字符串tif=“C:/Sample.tif”;
私有静态字符串pdf=“C:/Sample.pdf”;
私有静态字符串watermarkpdf=“C:/Watermark.pdf”
公共静态void main(字符串[]args)引发异常{
转换(tif,pdf);
文件水印=新文件(水印PDF);
OutputStream OutputStream=新文件OutputStream(水印);
addWaterMark(pdf,outputStream,“这是示例水印”);
}
公共静态文件转换(字符串tif、字符串pdf){
文件pdfFile=null;
字符串imgeFilename=tif;
文档=新文档();
试一试{
PdfWriter writer=PdfWriter.getInstance(
文件,
新的FileOutputStream(pdf));
writer.setStritimagesequence(true);
图像;
document.open();
RandomAccessFileOrArray ra=新的RandomAccessFileOrArray(imgeFilename);
int pagesTif=TiffImage.getNumberOfPages(ra);
例如(int i=1;i您的代码中有很多地方是错误的。例如:您说水印没有出现在最终的PDF中,但如果仔细观察,您会发现确实添加了水印,但它被不透明图像(您在上一次尝试中添加的TIFF)覆盖
查看您的代码。首先,您将cb
定义为覆盖图像的层:
PdfContentByte cb = stamp.getOverContent(page);
但几乎就在这一行之后,您将cb
重新定义为位于现有图像下的层:
cb = stamp.getUnderContent(page);
删除此行,将显示水印
您没有帮客户的忙,因为:
你使用的iText版本可能会给他带来麻烦
您的addWatermark()
方法假定坐标系的原点是(0,0)
,但情况并非总是如此,因此如果您的客户开始将您的方法用于其他PDF,则可能会在页面的可见区域外添加水印
首先创建PDF,然后读取该PDF以添加水印。为什么不在创建期间使用页面事件添加水印
创建PDF时,您将缩放TIFF图像以精确匹配A4页面。这意味着,如果图像的纵横比与A4页面的纵横比不同,则图像将严重失真。例如:您创建纵向页面,但如果TIFF是横向页面,则会使TIFF难以辨认
总而言之,您的代码不适合生产。我的建议是重写它并使用最新的iText版本。您使用的是不再受支持的iText版本。请停止使用它。无论您的客户是谁,他都不会欣赏您将过时软件引入其代码库的事实。