加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

java使用itext为PDF文件添加水印

(2015-05-05 13:02:24)
标签:

java

pdf

pdf水印

itextpdf

分类: JAVA生涯

前段时间在弄一些关于PDF文件添加水印的问题,发现网上对于这个问题的文章还是不少,但是具体实现起来的时候总是遇到一些瑕疵,不能很好的使用。首先,关于PDF文件添加水印的开源工具,大部分朋友使用的是itext开源的工具进行处理,当然PDFBox也可以处理,只是资料相对较少。


下面说一下,我实现的过程,这其中也是走了一些弯路。刚刚使用时只需要添加文字水印,可是当时没能解决中文无法添加的问题(这个问题在后来看来是多么的幼稚,只怪自己当时没能多多尝试),因此第一阶段实现的思路变成了首先为空白的图片添加水印文字,然后再为PDF文件添加水印图片,具体代码如下:

 
   public static boolean createImageFile(String filePath,String logoText,String OutFilePath){
       try {
           OutputStream os = null;
            // 1、源图片
           Image srcImg = ImageIO.read(new File(filePath));
           BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
           // 2、得到画笔对象
           Graphics2D g = buffImg.createGraphics();
           // 3、设置对线段的锯齿状边缘处理
           g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
           g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);
           // 4、设置水印旋转
           g.rotate(Math.toRadians(-55),(double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);
           // 5、设置水印文字颜色
           g.setColor(color);
           // 6、设置水印文字Font
           font = new Font("宋体", 10, 30);
           g.setFont(font);
           // 7、设置水印文字透明度
           g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,alpha));
           // 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)
           positionWidth = (buffImg.getWidth())/2;
           positionHeight = buffImg.getHeight()/2;
           //g.drawString(logoText, 10, 200);
          
           logoText = logoText + logoText + logoText + logoText + logoText + logoText;
           g.drawString(logoText, -210, 455);
           // 9、释放资源
           g.dispose();
           // 10、生成图片
           os = new FileOutputStream(OutFilePath);
           ImageIO.write(buffImg, "JPG", os);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

后来发现itext添加文字水印是可以实现中文的,只是需要添加另外的JAR包,itext-asian.jar,具体实现的代码如下:


    public static boolean waterMark(String inputFile, String imageFile,
            String outputFile, String waterMarkName, int permission) {
        try {
            PdfReader reader = new PdfReader(inputFile);
            PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(
                    outputFile));
            //这里的字体设置比较关键,这个设置是支持中文的写法
            BaseFont base = BaseFont.createFont("STSong-Light",
                    "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);// 使用系统字体
            int total = reader.getNumberOfPages() + 1;
            Image image = Image.getInstance(imageFile);
            // 图片位置
            //image.setAbsolutePosition(110, 110);
           
            image.setAbsolutePosition(10, -10); 
            PdfContentByte under;
            Rectangle pageRect = null;
            for (int i = 1; i < total; i++) {
                pageRect = stamper.getReader().
                           getPageSizeWithRotation(i);
                // 计算水印X,Y坐标
                float x = pageRect.getWidth()/10;
                float y = pageRect.getHeight()/10-10;
                // 获得PDF最顶层
                under = stamper.getOverContent(i);
                under.saveState();
                // set Transparency
                PdfGState gs = new PdfGState();
                // 设置透明度为0.2
                gs.setFillOpacity(1.f);
                under.setGState(gs);
                // 注意这里必须调用一次restoreState 否则设置无效
                under.restoreState();
                under.beginText();
                under.setFontAndSize(base, 30);
                under.setColorFill(new BaseColor(238, 209, 212));
               
                // 水印文字成45度角倾斜
                under.showTextAligned(Element.ALIGN_CENTER
                        , waterMarkName, x,
                        y, 55);
                // 添加水印文字
                under.endText();
                under.setLineWidth(1f);
                under.stroke();
            }
            stamper.close();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

由于时间比较紧张,如果有写的不好的地方欢迎大家提出,愿为大家随时解决问题。


java的开源pdf库-Itext可以给pdf添加水印,主要是使用showTextAligned这个方法.ShowTextAligned方法可以设置输出水印的文本和水印文本的旋转角度,ShowTextAligned方法具体的参数说明如下:

public void ShowTextAligned(int alignment, String text, float x,float y, float rotation)

参数 参数说明:
alignment 左、右、居中(ALIGN_CENTER, ALIGN_RIGHT or ALIGN_LEFT)
text 要输出的文本
x 文本输入的X坐标
y 文本输入的Y坐标
rotation 文本的旋转角度

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有