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
相关推荐
本示例涉及的是将Word文档转换为PDF格式,并在生成的PDF上添加文字水印,这通常用于版权保护或定制化展示。以下是关于这个过程的详细说明。 首先,我们需要了解`aspose-words-15.8.0-jdk16.jar`这个库。Aspose....
- **文字水印与图像水印**:文字水印简洁明了,适合添加公司名或“草稿”等字样;图像水印则更灵活,可以使用公司logo等增强辨识度。 - **版权声明**:在添加水印时,确保不侵犯他人版权,只使用自己拥有权利的...
在IT行业中,尤其是在文档处理领域,为Word和PDF文件添加水印是一项常见的需求。这主要应用于保护知识产权,表明文档的预览性质或者增加特定标识。本文将深入探讨如何使用C#语言结合.NET框架来实现这一功能,特别是...
总结,通过结合iTextPDF和Jacob这两个库,Java开发者可以在Word文档中添加图片水印,从而实现对文档的个性化定制和保护。这种方法需要对Java、COM组件以及Word API有一定的理解,但是一旦掌握,就可以灵活地处理各种...
在Java开发中,有时我们需要处理文档模板,将动态数据填入到Word模板中,并且可能还需要将处理后的Word文档转换为PDF格式,同时在PDF上添加水印。在这个场景下,`Apache POI`和`Aspose.Words for Java`是两个常用的...
本篇将详细介绍如何利用Java进行Word到PDF的转换,并且着重讲解支持水印设置的代码实例。 首先,我们需要一个合适的库来处理这个转换过程。Apache POI是一个流行的Java库,用于处理Microsoft Office格式,包括Word...
这个名为“pdf、word、excel水印.zip”的压缩包文件显然包含了用于在PDF、Word和Excel文档上添加水印的工具和代码。以下是相关知识点的详细说明: 1. **水印的概念**:水印是在文档背景中添加的半透明图像或文字,...
批量PDF转换器是一款功能强大、界面简洁、操作简单的PDF转换转换及优化工具。 此软件功能如下: 1.PDF转换成WORD,WORD转换成PDF 2.PDF转换成EXCEL,EXCEL转换成...8.PDF添加文字水印或图片水印PDF添加文字及图片水印
总之,Aspose Words是一个强大且灵活的工具,可以帮助Java开发者轻松地在Word和PDF之间进行转换,同时保持高质量的输出,无论是文本、图片还是复杂的表格。通过合理的配置和适当的代码实现,可以满足各种项目需求,...
Aspose.Words的水印功能不仅限于文字,还可以添加图片水印,甚至可以自定义水印的大小、旋转角度、位置等。此外,它还支持批量处理文档,这对于需要给大量文档添加水印的场景非常有用。 总的来说,"aspose-words ...
PDF转WORD工具“pdf2word_2.0_XiaZaiBa”是一个专门用于将PDF文档转换成可编辑的Microsoft Word格式的软件。这个版本2.0代表着它可能包含了一些性能提升和新功能,旨在提高转换效率和转换后的文档质量。在IT行业中,...
去插件水印,添加word、excel、pdf 文字与图片水印功能。执行转化方法前会分别先执行loadLicense()、getLicenseExcel()、getLicensePpt() 加载license.xml文件,不会出现插件水印。 主要包含aspose.pdf-17.3.0.jar...
Java使用Spire讲网页保存为PDF并去除Evaluation Warning水印方案,https://blog.csdn.net/kewen_123/article/details/121025630
标题中的“批量处理doc和pdf水印”是指一种技术或工具,用于同时在多个Microsoft Word (doc) 和Adobe PDF文档上添加水印。这通常是为了保护文档版权、标记机密性或者表明文档的状态(如草稿或最终版)。批量处理可以...
标题提到的"word/ppt转换pdf-pdf转换为jpg-jpg加水印"涵盖了四个主要操作:Word文档转PDF、PPT转换成PDF、PDF转为JPG图像,以及在JPG图片上添加水印。下面将详细解释这些知识点。 1. **Word文档转PDF**: 在不同的...
压缩包内的文件"solidconverterpdf.exe"可能是这款软件的安装程序,Solid Converter PDF是一款知名的PDF转换工具,它具有上述提到的功能,包括高质量的PDF到Word转换以及水印去除。"说明_Readme.html"则很可能是软件...
在给定的“pdf,png,gif,jpg,word打水印.rar”压缩包中,包含了为PDF、PNG、GIF、JPG图像以及Word文档添加水印的功能。这个压缩包可能包含了一个名为"WaterMark.cs"的C#源代码文件,以及一个"WaterMarkFactory"的示例...
2. **文本与图像提取**:转换工具需准确识别PDF中的文本和图像,将它们分别转换为Word文档的文本框和图片对象。这涉及到光学字符识别(OCR)技术,尤其是对于扫描的PDF。 3. **布局保持**:为了确保转换后的Word...
PDF文件通常包含矢量图形和嵌入的字体,这意味着转换过程中要确保文字清晰、图片质量不受损,并且页面布局尽可能接近原文档。`v3.0`可能代表这个软件的第三个主要版本,通常意味着更稳定、更高效和更多功能。 PDF到...
PDF万能工具支持将PDF文档转换为常见的办公格式,如Word(.doc, .docx)、Excel(.xls, .xlsx)、PowerPoint(.ppt, .pptx)等,甚至还可以转换为图片(.jpg, .png)或其他文本格式。这种转换不仅保持了原始文档的...