我想用watermark.So打印一个tiff图像,首先我将tiff图像转换成pdf,然后在生成的pdf.But中添加水印,水印不会出现在最终的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 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();
}}
发布于 2015-02-09 07:34:33
您的代码有很多错误。例如:您说水印不会出现在最后的PDF中,但是如果仔细观察,您会发现水印确实被添加了,但是它被一个不透明的图像所覆盖(您在前面的go中添加的TIFF )。
看看你的代码。首先,将cb定义为覆盖图像的层:
PdfContentByte cb = stamp.getOverContent(page);但是,几乎就在这一行之后,您将cb重新定义为位于现有映像之下的层:
cb = stamp.getUnderContent(page);删除这一行,您的水印就会出现。
你不是在帮你的客户,因为:
addWatermark()方法假设坐标系统的起源是(0, 0),而情况并不总是这样,所以如果您的客户开始对其他PDF使用您的方法,它可能会在页面可见区域之外添加水印。总之,您的代码不适合生产。我的建议是重写它并使用最新的iText版本。
https://stackoverflow.com/questions/28404407
复制相似问题