有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在java中使用itext 2.1.7向TIFF图像添加水印

我想打印带有水印的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 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();
}

}


共 (1) 个答案

  1. # 1 楼答案

    你的代码有很多问题。例如:你说水印没有出现在最终的PDF中,但如果你仔细看,你会发现确实添加了水印,但它被不透明图像(你在上一次尝试中添加的TIFF)覆盖

    看看你的代码。首先,将cb定义为覆盖图像的层:

        PdfContentByte cb = stamp.getOverContent(page);
    

    但几乎就在那一行之后,您将cb重新定义为位于现有图像下的层:

        cb = stamp.getUnderContent(page);
    

    删除这一行,你的水印就会出现

    你没有帮你的客户一个忙,因为:

    1. 你使用的iText版本可能会给他带来麻烦
    2. 你的addWatermark()方法假设坐标系的原点是(0, 0),但情况并非总是如此,因此如果你的客户开始将你的方法用于其他PDF,它可能会在页面的可见区域之外添加水印
    3. 首先创建一个PDF,然后阅读该PDF以添加水印。为什么不在创建过程中使用页面事件添加水印
    4. 创建PDF时,可以缩放TIFF图像,使其与A4页面完全匹配。这意味着,如果图像的纵横比与A4页面的纵横比不同,图像将严重失真。例如:你创建了一个纵向页面,但是如果TIFF是横向页面,你会使TIFF难以辨认

    总而言之,您的代码不适合生产。我的建议是重写它并使用最新的iText版本