Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中使用itext 2.1.7向TIFF图像添加水印_Java_Itext_Watermark - Fatal编程技术网

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

如何在java中使用itext 2.1.7向TIFF图像添加水印,java,itext,watermark,Java,Itext,Watermark,我想打印带有水印的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 PRIMAR

我想打印带有水印的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();
}
公共类TiffToPdf{
专用静态int TEXT_TILT_ANGLE=25;
私有静态颜色中灰色=新颜色(242,17,72);
私有静态int PRIMARY\u FONT\u SIZE=50;
私有静态字符串tif=“C:/Sample.tif”;
私有静态字符串pdf=“C:/Sample.pdf”;
私有静态字符串watermarkpdf=“C:/Watermark.pdf”
公共静态void main(字符串[]args)引发异常{
转换(tif,pdf);
文件水印=新文件(水印PDF);
OutputStream OutputStream=新文件OutputStream(水印);
addWaterMark(pdf,outputStream,“这是示例水印”);
}
公共静态文件转换(字符串tif、字符串pdf){
文件pdfFile=null;
字符串imgeFilename=tif;
文档=新文档();
试一试{
PdfWriter writer=PdfWriter.getInstance(
文件,
新的FileOutputStream(pdf));
writer.setStritimagesequence(true);
图像;
document.open();
RandomAccessFileOrArray ra=新的RandomAccessFileOrArray(imgeFilename);
int pagesTif=TiffImage.getNumberOfPages(ra);

例如(int i=1;i您的代码中有很多地方是错误的。例如:您说水印没有出现在最终的PDF中,但如果仔细观察,您会发现确实添加了水印,但它被不透明图像(您在上一次尝试中添加的TIFF)覆盖

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

    PdfContentByte cb = stamp.getOverContent(page);
但几乎就在这一行之后,您将
cb
重新定义为位于现有图像下的层:

    cb = stamp.getUnderContent(page);
删除此行,将显示水印

您没有帮客户的忙,因为:

  • 你使用的iText版本可能会给他带来麻烦
  • 您的
    addWatermark()
    方法假定坐标系的原点是
    (0,0)
    ,但情况并非总是如此,因此如果您的客户开始将您的方法用于其他PDF,则可能会在页面的可见区域外添加水印
  • 首先创建PDF,然后读取该PDF以添加水印。为什么不在创建期间使用页面事件添加水印
  • 创建PDF时,您将缩放TIFF图像以精确匹配A4页面。这意味着,如果图像的纵横比与A4页面的纵横比不同,则图像将严重失真。例如:您创建纵向页面,但如果TIFF是横向页面,则会使TIFF难以辨认

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

    您使用的是不再受支持的iText版本。请停止使用它。无论您的客户是谁,他都不会欣赏您将过时软件引入其代码库的事实。