Как добавить водяной знак в изображение TIFF, используя itext 2.1.7 в Java

1

Я хочу распечатать 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();
}

}

  • 0
    Вы используете версию iText, которая больше не поддерживается. Пожалуйста, прекратите использовать его по этой причине . Кто бы ни был вашим клиентом, он не оценит тот факт, что вы вводите устаревшее программное обеспечение в его кодовую базу.
Теги:
itext
watermark

1 ответ

2
Лучший ответ

Многие вещи не соответствуют вашему коду. Например: вы говорите, что водяной знак не отображается в вашем окончательном 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, чтобы точно соответствовать странице формата А4. Это означает, что изображения будут сильно искажены, если они имеют соотношение сторон, которое отличается от формата изображения на странице формата А4. Например: вы создаете страницу в портрете, но если TIFF является страницей в альбомной ориентации, вы сделаете TIFF неразборчивым.

В целом, ваш код не подходит для производства. Мой совет - переписать его и использовать самую последнюю версию iText.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню