java 如何使用 itext 2.1.7 为 TIFF 图像添加水印

How to add watermark to TIFF image using itext 2.1.7 in java

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

}

您的代码有很多问题。例如:你说水印没有出现在你的最终 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 版本。