Я хочу распечатать 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();
}
}
Многие вещи не соответствуют вашему коду. Например: вы говорите, что водяной знак не отображается в вашем окончательном PDF файле, но если вы посмотрите ближе, вы увидите, что водяной знак действительно добавлен, но он покрыт непрозрачным изображением (TIFF, добавленный в предыдущем идти).
Посмотрите на свой код. Сначала вы определяете cb
как слой, который покрывает изображение:
PdfContentByte cb = stamp.getOverContent(page);
Но почти сразу после этой строки вы переопределяете cb
как слой, который идет под существующим изображением:
cb = stamp.getUnderContent(page);
Удалите эту строку, и появится ваш водяной знак.
Вы не пользуетесь своим клиентом, потому что:
addWatermark()
предполагает, что источником системы координат является (0, 0)
и это не всегда так, поэтому, если ваш клиент начнет использовать ваш метод для других PDF файлов, он может добавить водяной знак за пределы видимой области страница.В целом, ваш код не подходит для производства. Мой совет - переписать его и использовать самую последнюю версию iText.