`
HWL_SZ
  • 浏览: 54179 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

PDF、WORD、图片文字水印

    博客分类:
  • JAVA
阅读更多

 

package util;

 

import java.awt.AlphaComposite;

import java.awt.Color;

import java.awt.Font;

import java.awt.FontMetrics;

import java.awt.Graphics2D;

import java.awt.Image;

import java.awt.RenderingHints;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.FileOutputStream;

import java.io.OutputStream;

import java.text.SimpleDateFormat;

import java.util.Date;

 

import javax.imageio.ImageIO;

 

import com.jacob.activeX.ActiveXComponent;

import com.jacob.com.ComThread;

import com.jacob.com.Dispatch;

import com.jacob.com.Variant;

import com.lowagie.text.Element;

import com.lowagie.text.pdf.BaseFont;

import com.lowagie.text.pdf.PdfContentByte;

import com.lowagie.text.pdf.PdfGState;

import com.lowagie.text.pdf.PdfReader;

import com.lowagie.text.pdf.PdfStamper;

 

 

/**

 *

 * @author HWL_SZ

 * @version [版本号]

 * @see [相关类/方法]

 * @since [产品/模块版本]

 */

publicclass WaterMark

{

    /**

     * @param args

     */

    publicstaticvoid main(String[] args) throws Exception

    {

       String waterMark = "2013公司内部文件,请注意保密!";

       String footerMark = "打印时间:"+ new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date())

           + "  打印人:" + "HWL_SZ";

      

       WaterMark.writePdfMark("E:/20131028.pdf", "E:/20131028_water.pdf", waterMark, footerMark);

      

       WaterMark.writeImgMark("E://psb.jpg", "E://psb_water.jpg", waterMark, footerMark);

      

       WaterMark.writeDocMark("E://20131024.doc", "E://20131024_water.doc", waterMark , footerMark);

    }

   

    /**

     * pdf加水印号

     * @param sourceImg 源文件路径

     * @param targetImg 加水印号文件输出路径

     * @param waterMark 背景水印号

     * @param footerMark 页脚文字

     * @return加水印号文件输出路径

     * @throws Exception

     */

    publicstatic String writePdfMark(String sourcePdf, String targetPdf,String waterMark, String footerMark)

    throws Exception

    {

       // 未加水印的源文件

       PdfReader reader = new PdfReader(sourcePdf);

      

       // 加完水印的输出文件

       PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(targetPdf));

      

       // pdf总页数

       int total = reader.getNumberOfPages() + 1;

      

       // 设置字体

       BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",

              BaseFont.EMBEDDED);

      

       PdfGState gs = new PdfGState();

       // 对每页加入水印

       for (int i = 1; i < total; i++) {

           PdfContentByte content = stamper.getOverContent(i);

           gs.setFillOpacity(0.2f);

           content.beginText();

           // 字体颜色

           content.setColorFill(Color.LIGHT_GRAY);

           // 字体编码和大小

           content.setFontAndSize(base, 50);

           /**

            * 写入背景水印

            * 参数说明

            * 1:对齐方式

            * 2:水印内容

            * 3:左边距

            * 4:底边距

            * 5:倾斜度

            */

           if (null != waterMark && !"".equals(waterMark.trim()))

           {

              content.showTextAligned(Element.ALIGN_CENTER, waterMark, 300,

                     350, 60);

           }

          

 

           /**

            * 页脚

            */

           content.setColorFill(Color.BLACK);

           content.setFontAndSize(base, 8);

           if (null != footerMark && !"".equals(footerMark.trim()))

           {

              content.showTextAligned(Element.ALIGN_CENTER, footerMark, 300, 10, 0);

           }

           content.endText();

       }

       stamper.close();

      

       return footerMark;

    }

   

    /**

     * 图片加水印号

     * @param sourceImg 源文件路径

     * @param targetImg 加水印号文件输出路径

     * @param waterMark 背景水印号

     * @param footerMark 页脚文字

     * @return加水印号文件输出路径

     * @throws Exception

     */

    publicstatic String writeImgMark(String sourceImg, String targetImg,String waterMark, String footerMark)

    {

       OutputStream os = null; 

       String postfix = getPostfix(sourceImg);

        try

        {

            Image srcImg = ImageIO.read(new File(sourceImg));

            int width = srcImg.getWidth(null);

            int height = srcImg.getHeight(null);

            //计算水印文字旋转角度

            double degree = Math.atan((double) height/width );

            BufferedImage buffImg = null;           

            if("png".equalsIgnoreCase(postfix.toLowerCase()))

            {

                buffImg = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);

            }

            else

            {

                buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

            }

    

            // 得到画笔对象

            Graphics2D g = buffImg.createGraphics();    

            // 设置对线段的锯齿状边缘处理

            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);  

            g.drawImage(srcImg.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0,0, null);                  

            // 设置透明度

            float alpha = 0.3f;

            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));

            Font font = new Font("宋体", Font.CENTER_BASELINE, 30);

            g.setFont(font);

            g.setColor(Color.black);

            FontMetrics   fm = g.getFontMetrics(font);

           

            int textWidth;

            // 水印号

            if (null != waterMark && !"".equals(waterMark.trim()))

            {

              textWidth = fm.stringWidth(waterMark);

              // 设置水印旋转角度和位置(旋转角度以弧度为单位的)

                g.rotate(-degree,(double) width / 2, (double) height / 2);

              g.drawString(waterMark, (width-textWidth)/2, (height-80)/2);

            }

           

            // 底部页脚文字

            if (null != waterMark && !"".equals(waterMark.trim()))

            {

              textWidth = fm.stringWidth(footerMark);

              g.rotate(degree,(double) width / 2, (double) height / 2);

              g.drawString(footerMark ,(width - textWidth)/2,height-30);

            }

           

            g.dispose();

            os = new FileOutputStream(targetImg);

 

            // 重新生成图片

            ImageIO.write(buffImg, postfix, os);

           

            return targetImg;

 

            }

            catch (Exception e)

            {

                e.printStackTrace();

                returnnull;

            }

            finally

            {

 

                try

                {

                    if (null != os)

                        os.close();

                }

                catch (Exception e)

                {

                    e.printStackTrace();

                }

            }        

    }

   

    /**

     * 说明:此方法需要调用dll文件,存在平台相关性,不建议项目使用,仅供学习。

     * 依赖的jacob.dll文件需要放到C:\WINDOWS\system32目录下,否则无法使用

     *

     * word加水印号

     * @param sourceFile 源文件路径

     * @param targetFile 加水印号文件输出路径

     * @param waterMark 水印号

     * @param footerMark 页脚文字

     * @return加水印号文件输出路径

     * @throws Exception

     */

    publicstatic String writeDocMark(String sourceFile, String targetFile, String waterMark, String footerMark)

    {

       // 初始化com的线程

       ComThread.InitSTA();

       ActiveXComponent activeX = new ActiveXComponent("word.Application");

       Dispatch docs = activeX.getProperty("Documents").toDispatch();

       // 设置打开的word应用程序是否可见

       activeX.setProperty("Visible", new Variant(false));

 

       Dispatch document = Dispatch.call(docs, "Open", sourceFile).toDispatch();

      

       // 获得活动窗体对象

       Dispatch activeWin = activeX.getProperty("ActiveWindow")

              .toDispatch();

       Dispatch activePan = Dispatch.get(activeWin, "ActivePane")

              .toDispatch();

       // 取得视窗对象

       Dispatch view = Dispatch.get(activePan, "View").toDispatch();

       // 输入页眉内容

//     Dispatch.put(view, "SeekView", new Variant(9));

       Dispatch fileSelection = Dispatch.get(activeX, "Selection")

       .toDispatch();

//     Dispatch.put(fileSelection, "Text", "页眉文字....!!");

      

       // 页脚内容

       Dispatch.put(view, "SeekView", new Variant(10));

       Dispatch.put(fileSelection, "Text", footerMark);

      

      

       Dispatch headfooter = Dispatch.get(fileSelection, "HeaderFooter")

              .toDispatch();

       // 取得图形对象

       Dispatch shapes = Dispatch.get(headfooter, "Shapes").toDispatch();

       // 给文档全部加上水印

       Dispatch selection = Dispatch.call(shapes, "AddTextEffect",

              new Variant(9), waterMark, "宋体", new Variant(1),

              new Variant(false), new Variant(false), new Variant(0),

              new Variant(0)).toDispatch();

       Dispatch.call(selection, "Select");

       // 设置水印参数

       Dispatch shapeRange = Dispatch.get(fileSelection, "ShapeRange")

              .toDispatch();

       Dispatch.put(shapeRange, "Name", "PowerPlusWaterMarkObject1");

       Dispatch textEffect = Dispatch.get(shapeRange, "TextEffect")

              .toDispatch();

       Dispatch.put(textEffect, "NormalizedHeight", new Boolean(false));

       Dispatch line = Dispatch.get(shapeRange, "Line").toDispatch();

       Dispatch.put(line, "Visible", new Boolean(false));

       Dispatch fill = Dispatch.get(shapeRange, "Fill").toDispatch();

       Dispatch.put(fill, "Visible", new Boolean(true));

       // 设置水印透明度

       Dispatch.put(fill, "Transparency", new Variant(0.2));

       Dispatch foreColor = Dispatch.get(fill, "ForeColor").toDispatch();

       // 设置水印颜色

       Dispatch.put(foreColor, "RGB", new Variant(16711680));

       Dispatch.call(fill, "Solid");

       // 设置水印旋转

       Dispatch.put(shapeRange, "Rotation", new Variant(315));

       Dispatch.put(shapeRange, "LockAspectRatio", new Boolean(true));

       Dispatch.put(shapeRange, "Height", new Variant(117.0709));

       Dispatch.put(shapeRange, "Width", new Variant(468.2835));

       Dispatch.put(shapeRange, "Left", new Variant(-999995));

       Dispatch.put(shapeRange, "Top", new Variant(-999995));

       Dispatch wrapFormat = Dispatch.get(shapeRange, "WrapFormat")

              .toDispatch();

       // 是否允许交叠

       Dispatch.put(wrapFormat, "AllowOverlap", new Variant(false));

       Dispatch.put(wrapFormat, "Side", new Variant(3));

       Dispatch.put(wrapFormat, "Type", new Variant(3));

       Dispatch.put(shapeRange, "RelativeHorizontalPosition", new Variant(0));

       Dispatch.put(shapeRange, "RelativeVerticalPosition", new Variant(0));

       Dispatch.put(view, "SeekView", new Variant(0));

      

      

       if (null != document)

       {

           Dispatch.invoke(document, "SaveAs", Dispatch.Method, new Object[] {targetFile, new Variant(0)} , newint[1]);

           Dispatch.call(document, "Close", new Variant(true));

       }

 

       if (null != activeX)

       {

           // 关闭word文件

           activeX.invoke("Quit", new Variant[]{});

       }

      

       // 释放com线程

       ComThread.Release();

       return targetFile;

    }

   

    /**

     * 获取文件的后缀名

     */

    privatestatic String getPostfix(String inputFilePath)

    {

       String[] p = inputFilePath.split("\\.");

       if (p.length > 0)

       {

           return p[p.length - 1];

       }

       else

       {

           returnnull;

       }

    }

 

}

 

依赖的jar包:iText-2.1.7.jar、iTextAsian.jar、jacob.jar

依赖的文件:jacob.dll

0
0
分享到:
评论

相关推荐

    word转pdf加水印demo.zip

    本示例涉及的是将Word文档转换为PDF格式,并在生成的PDF上添加文字水印,这通常用于版权保护或定制化展示。以下是关于这个过程的详细说明。 首先,我们需要了解`aspose-words-15.8.0-jdk16.jar`这个库。Aspose....

    word转pdf并加水印

    - **文字水印与图像水印**:文字水印简洁明了,适合添加公司名或“草稿”等字样;图像水印则更灵活,可以使用公司logo等增强辨识度。 - **版权声明**:在添加水印时,确保不侵犯他人版权,只使用自己拥有权利的...

    c# word /pdf添加水印

    在IT行业中,尤其是在文档处理领域,为Word和PDF文件添加水印是一项常见的需求。这主要应用于保护知识产权,表明文档的预览性质或者增加特定标识。本文将深入探讨如何使用C#语言结合.NET框架来实现这一功能,特别是...

    Java 实现word文件增加图片水印 jacob实现 用到的jar

    总结,通过结合iTextPDF和Jacob这两个库,Java开发者可以在Word文档中添加图片水印,从而实现对文档的个性化定制和保护。这种方法需要对Java、COM组件以及Word API有一定的理解,但是一旦掌握,就可以灵活地处理各种...

    Java 使用 poi 和 aspose 实现 word 模板数据写入并转换 pdf 增加水印

    在Java开发中,有时我们需要处理文档模板,将动态数据填入到Word模板中,并且可能还需要将处理后的Word文档转换为PDF格式,同时在PDF上添加水印。在这个场景下,`Apache POI`和`Aspose.Words for Java`是两个常用的...

    word转pdf最好用的java代码实例,支持水印设置。

    本篇将详细介绍如何利用Java进行Word到PDF的转换,并且着重讲解支持水印设置的代码实例。 首先,我们需要一个合适的库来处理这个转换过程。Apache POI是一个流行的Java库,用于处理Microsoft Office格式,包括Word...

    pdf、word、excel水印.zip

    这个名为“pdf、word、excel水印.zip”的压缩包文件显然包含了用于在PDF、Word和Excel文档上添加水印的工具和代码。以下是相关知识点的详细说明: 1. **水印的概念**:水印是在文档背景中添加的半透明图像或文字,...

    全功能能批量PDF转换成WORD转换器

    批量PDF转换器是一款功能强大、界面简洁、操作简单的PDF转换转换及优化工具。 此软件功能如下: 1.PDF转换成WORD,WORD转换成PDF 2.PDF转换成EXCEL,EXCEL转换成...8.PDF添加文字水印或图片水印PDF添加文字及图片水印

    (java)aspose实现word转pdf,高清无水印.aspose-words-14.9.0-jdk16.jar,已测试正常

    总之,Aspose Words是一个强大且灵活的工具,可以帮助Java开发者轻松地在Word和PDF之间进行转换,同时保持高质量的输出,无论是文本、图片还是复杂的表格。通过合理的配置和适当的代码实现,可以满足各种项目需求,...

    aspose-words word添加水印的jar和licence文件

    Aspose.Words的水印功能不仅限于文字,还可以添加图片水印,甚至可以自定义水印的大小、旋转角度、位置等。此外,它还支持批量处理文档,这对于需要给大量文档添加水印的场景非常有用。 总的来说,"aspose-words ...

    PDF转WORDpdf2word_2.0_XiaZaiBa

    PDF转WORD工具“pdf2word_2.0_XiaZaiBa”是一个专门用于将PDF文档转换成可编辑的Microsoft Word格式的软件。这个版本2.0代表着它可能包含了一些性能提升和新功能,旨在提高转换效率和转换后的文档质量。在IT行业中,...

    Aspose, word、excel、PPT 转PDF文件jar包加工具类

    去插件水印,添加word、excel、pdf 文字与图片水印功能。执行转化方法前会分别先执行loadLicense()、getLicenseExcel()、getLicensePpt() 加载license.xml文件,不会出现插件水印。 主要包含aspose.pdf-17.3.0.jar...

    Java使用Spire讲网页保存为PDF并去除Evaluation Warning水印方案

    Java使用Spire讲网页保存为PDF并去除Evaluation Warning水印方案,https://blog.csdn.net/kewen_123/article/details/121025630

    批量处理doc和pdf水印

    标题中的“批量处理doc和pdf水印”是指一种技术或工具,用于同时在多个Microsoft Word (doc) 和Adobe PDF文档上添加水印。这通常是为了保护文档版权、标记机密性或者表明文档的状态(如草稿或最终版)。批量处理可以...

    word/ppt转换pdf-pdf转换为jpg-jpg加水印

    标题提到的"word/ppt转换pdf-pdf转换为jpg-jpg加水印"涵盖了四个主要操作:Word文档转PDF、PPT转换成PDF、PDF转为JPG图像,以及在JPG图片上添加水印。下面将详细解释这些知识点。 1. **Word文档转PDF**: 在不同的...

    pdf转word我用过的最好的免费软件

    压缩包内的文件"solidconverterpdf.exe"可能是这款软件的安装程序,Solid Converter PDF是一款知名的PDF转换工具,它具有上述提到的功能,包括高质量的PDF到Word转换以及水印去除。"说明_Readme.html"则很可能是软件...

    pdf,png,gif,jpg,word打水印.rar

    在给定的“pdf,png,gif,jpg,word打水印.rar”压缩包中,包含了为PDF、PNG、GIF、JPG图像以及Word文档添加水印的功能。这个压缩包可能包含了一个名为"WaterMark.cs"的C#源代码文件,以及一个"WaterMarkFactory"的示例...

    PDF转Word工具

    2. **文本与图像提取**:转换工具需准确识别PDF中的文本和图像,将它们分别转换为Word文档的文本框和图片对象。这涉及到光学字符识别(OCR)技术,尤其是对于扫描的PDF。 3. **布局保持**:为了确保转换后的Word...

    pdf2word-v3.0.rar(pdf转word)

    PDF文件通常包含矢量图形和嵌入的字体,这意味着转换过程中要确保文字清晰、图片质量不受损,并且页面布局尽可能接近原文档。`v3.0`可能代表这个软件的第三个主要版本,通常意味着更稳定、更高效和更多功能。 PDF到...

    PDF万能工具(去水印,任意格式转换,合并,拆分,压缩,加密去密码)-免费pdf转换

    PDF万能工具支持将PDF文档转换为常见的办公格式,如Word(.doc, .docx)、Excel(.xls, .xlsx)、PowerPoint(.ppt, .pptx)等,甚至还可以转换为图片(.jpg, .png)或其他文本格式。这种转换不仅保持了原始文档的...

Global site tag (gtag.js) - Google Analytics