1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > java给 img pdf ppt docx doc wps wpt rtf xlsx xls et csv添加水印 img word ppt excel 转 pdf

java给 img pdf ppt docx doc wps wpt rtf xlsx xls et csv添加水印 img word ppt excel 转 pdf

时间:2018-12-21 03:43:11

相关推荐

java给 img pdf ppt docx doc wps wpt rtf xlsx xls et csv添加水印 img word ppt excel 转 pdf

/*** 给img、pdf、ppt、docx、doc、wps、wpt、rtf、xlsx、xls、et、csv添加水印* img、word、ppt、excel 转 pdf*/

import java.awt.*;import java.awt.Font;import java.awt.font.FontRenderContext;import java.awt.geom.Rectangle2D;import java.awt.image.BufferedImage;import java.io.*;import javax.imageio.ImageIO;import javax.swing.JLabel;import com.spire.doc.PictureWatermark;import com.spire.doc.TextWatermark;import com.spire.pdf.PdfDocument;import com.spire.pdf.PdfPageBase;import com.spire.pdf.graphics.PdfImage;import com.spire.presentation.*;import com.spire.presentation.drawing.FillFormatType;import com.itextpdf.text.DocumentException;import com.itextpdf.text.Element;import com.itextpdf.text.Rectangle;import com.itextpdf.text.pdf.BaseFont;import com.itextpdf.text.pdf.PdfContentByte;import com.itextpdf.text.pdf.PdfGState;import com.itextpdf.text.pdf.PdfReader;import com.itextpdf.text.pdf.PdfStamper;import org.apache.poi.ss.usermodel.Workbook;import org.apache.poi.xssf.usermodel.XSSFRelation;import org.apache.poi.xssf.usermodel.XSSFSheet;import org.apache.poi.xssf.usermodel.XSSFWorkbook;public class WaterMarkUtils {/*** @param args* @throws IOException* @throws DocumentException*/public static void main(String[] args) throws Exception {String filePath = "E:\\桌面\\水印\\";//1、给图片添加文字水印WaterMarkUtils.setWaterMarkToImage("这是水印内容", filePath + "1.jpg", false);// WaterMarkUtils.img2pdf(filePath + "1.jpg" + "," + filePath + "1_水印.jpg", filePath + "1.pdf", false);//2、PDF添加动态水印// WaterMarkUtils.setWaterMarkToPdf("这是水印内容", filePath + "帆软报表.pdf", false);//3、PPT添加动态水印// WaterMarkUtils.setWaterMarkToPpt("这是水印内容", filePath + "ppt.ppt", true);//4、给docx、doc、wps、wpt、rtf加水印// WaterMarkUtils.setWaterMarkToWps("这是水印内容", filePath + "docx.docx", true);// WaterMarkUtils.setWaterMarkToWps2(filePath + "3.png", filePath + "docx.docx", true);// WaterMarkUtils.doc2pdf(filePath + "docx_水印.docx",filePath + "docx_水印222.pdf", false);// WaterMarkUtils.setWaterMarkToWps("这是水印内容", filePath + "docx.wps", true);// WaterMarkUtils.setWaterMarkToWps("这是水印内容", filePath + "doc.doc", false);// WaterMarkUtils.setWaterMarkToWps("这是水印内容", filePath + "wpt.wpt", false);// WaterMarkUtils.setWaterMarkToWps("这是水印内容", filePath + "rtf.rtf", false);//5、给excel加水印// WaterMarkUtils.setWaterMarkToExcel("这是水印内容", filePath + "excel.xlsx", true);// WaterMarkUtils.setWaterMarkToExcel("这是水印内容", filePath + "excel.xls");// WaterMarkUtils.setWaterMarkToExcel("这是水印内容", filePath + "excel.et");// WaterMarkUtils.setWaterMarkToExcel("这是水印内容", filePath + "excel.csv");// WaterMarkUtils.excel2pdf("E:\\桌面\\水印\\excel2_水印.et", "E:\\桌面\\水印\\excel2_水印.pdf");}}

1、图片添加动态文字水印

/*** 图片添加文字水印** @param 水印内容* @param 需要加水印的附件地址*/public static void setWaterMarkToImage(String 水印内容, String 需要加水印的附件地址, boolean 是否转PDF) {String 水印输出文件地址 = getOutputPath(需要加水印的附件地址);InputStream is = null;OutputStream os = null;try {// 1、源图片Image srcImg = ImageIO.read(new File(需要加水印的附件地址));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(45), buffImg.getWidth() / 2, buffImg.getHeight() / 2);// 5、设置水印文字颜色g.setColor(Color.blue);// 6、设置水印文字Fontg.setFont(new Font("宋体", Font.BOLD, buffImg.getHeight() / 5));// 7、设置水印文字透明度g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.3f));// 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)g.drawString(水印内容, buffImg.getWidth() / 3, buffImg.getHeight() / 4);// 9、释放资源g.dispose();// 10、图片后缀String suffix = 需要加水印的附件地址.substring(需要加水印的附件地址.lastIndexOf(".") + 1);// 11、生成图片os = new FileOutputStream(水印输出文件地址);ImageIO.write(buffImg, suffix, os);} catch (Exception e) {e.printStackTrace();} finally {try {if (null != is) {is.close();}} catch (Exception e) {e.printStackTrace();}try {if (null != os) {os.close();}} catch (Exception e) {e.printStackTrace();}}if (是否转PDF) {img2pdf(水印输出文件地址, getPdfPath(需要加水印的附件地址), false);}}

2、PDF添加动态文字水印

/*** PDF添加动态文字水印** @param 水印内容* @param 需要加水印的附件地址*/public static void setWaterMarkToPdf(String 水印内容, String 需要加水印的附件地址, boolean 是否删除源文件) throws DocumentException, IOException {// 1、要输出的pdf文件BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(getOutputPath(需要加水印的附件地址))));PdfReader reader = new PdfReader(需要加水印的附件地址);PdfStamper stamper = new PdfStamper(reader, bos);// 2、获取总页数 +1, 下面从1开始遍历int total = reader.getNumberOfPages() + 1;// 3、使用classpath下面的字体库BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);JLabel label = new JLabel();label.setText(水印内容);FontMetrics metrics = label.getFontMetrics(label.getFont());// 4、获取水印文字的高度和宽度int textH = metrics.getHeight();int textW = metrics.stringWidth(label.getText());// 5、设置水印透明度PdfGState gs = new PdfGState();gs.setFillOpacity(0.3f);gs.setStrokeOpacity(0.3f);Rectangle pageSizeWithRotation;PdfContentByte content;for (int i = 1; i < total; i++) {// 6、在内容上方加水印content = stamper.getOverContent(i);// 7、在内容下方加水印// content = stamper.getUnderContent(i);content.saveState();content.setGState(gs);// 8、设置字体和字体大小content.beginText();content.setFontAndSize(base, 20);// 9、获取每一页的高度、宽度pageSizeWithRotation = reader.getPageSizeWithRotation(i);float pageHeight = pageSizeWithRotation.getHeight();float pageWidth = pageSizeWithRotation.getWidth();// 10、间隔int interval = -15;int position = 0;for (int height = interval + textH; height < pageHeight; height = height + textH * 5) {for (int width = interval + textW - position * 150; width < pageWidth + textW; width = width + textW) {// 11、添加水印文字,水印文字成25度角倾斜content.showTextAligned(Element.ALIGN_LEFT, 水印内容, width - textW, height - textH / 2, 45);}position++;}content.endText();}// 12、关流stamper.close();reader.close();if (是否删除源文件) {del2file(需要加水印的附件地址);}}

3、PPT添加动态文字水印

/*** PPT添加动态文字水印** @param 水印内容* @param 需要加水印的附件地址*/public static void setWaterMarkToPpt(String 水印内容, String 需要加水印的附件地址, boolean 是否转PDF) throws Exception {// 1、加载PPT源文档Presentation ppt = new Presentation();ppt.loadFromFile(需要加水印的附件地址);String PPT水印文件地址 = getOutputPath(需要加水印的附件地址);// 2、遍历ppt每一页for (int p = 0; p < ppt.getSlides().size(); p++) {// 3、设置文本水印文本宽和高int width = 300;int height = 100;// 4、起始坐标float x = 10;float y = 40;ISlide slide = ppt.getSlides().get(p);for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {// 5、绘制文本,设置文本格式并将其添加到幻灯片Rectangle2D.Double rect = new Rectangle2D.Double(x, y, width, height);IAutoShape shape = slide.getShapes().appendShape(com.spire.presentation.ShapeType.RECTANGLE, rect);shape.getFill().setFillType(FillFormatType.NONE);shape.getShapeStyle().getLineColor().setColor(Color.white);shape.setRotation(-45);shape.getLocking().setSelectionProtection(true);shape.getLine().setFillType(FillFormatType.NONE);shape.getTextFrame().setText(水印内容);shape.setShapeArrange(ShapeAlignmentEnum.ShapeArrange.SendToBack);PortionEx textRange = shape.getTextFrame().getTextRange();textRange.getFill().setFillType(FillFormatType.SOLID);textRange.getFill().getSolidColor().setColor(new Color(238, 130, 238));textRange.setFontHeight(20);x += (100 + ppt.getSlideSize().getSize().getWidth() / 6);}x = 30;y += (100 + ppt.getSlideSize().getSize().getHeight() / 7);}}// 6、保存文档ppt.saveToFile(PPT水印文件地址, FileFormat.PPTX_);ppt.dispose();if (是否转PDF) {//将加水印的PPT转PDFppt2pdf(PPT水印文件地址, getPdfPath(需要加水印的附件地址), true);}}

4、wps添加文字水印

/*** docx、doc、wps、wpt、rtf添加文字水印** @param 水印内容* @throws Exception*/public static void setWaterMarkToWps(String 水印内容, String 需要加水印的附件地址, boolean 是否转PDF) throws Exception {String 水印输出文件地址 = getOutputPath(需要加水印的附件地址);com.spire.doc.Document doc = new com.spire.doc.Document();doc.loadFromFile(需要加水印的附件地址);//设置水印内容TextWatermark txtWatermark = new TextWatermark();txtWatermark.setText(水印内容);txtWatermark.setFontSize(75);txtWatermark.setColor(Color.red);txtWatermark.setLayout(com.spire.doc.documents.WatermarkLayout.Diagonal);doc.getSections().get(0).getDocument().setWatermark(txtWatermark);doc.saveToFile(水印输出文件地址, com.spire.doc.FileFormat.Docx);if (是否转PDF) {// 16、转PDFdoc2pdf(水印输出文件地址, getPdfPath(需要加水印的附件地址), false);}}

5、wps添加图片水印

/*** docx、doc、wps、wpt、rtf添加图片水印** @param 水印内容* @throws Exception*/public static void setWaterMarkToWps2(String 水印内容, String 需要加水印的附件地址, boolean 是否转PDF) throws Exception {String 水印输出文件地址 = getOutputPath(需要加水印的附件地址);com.spire.doc.Document doc = new com.spire.doc.Document();doc.loadFromFile(需要加水印的附件地址);//设置水印内容PictureWatermark picture = new PictureWatermark();picture.setPicture(水印内容);picture.setScaling(70);picture.isWashout(false);doc.setWatermark(picture);doc.saveToFile(水印输出文件地址, com.spire.doc.FileFormat.Docx);if (是否转PDF) {// 16、转PDFdoc2pdf(水印输出文件地址, getPdfPath(需要加水印的附件地址), false);}}

6、excel添加水印

/*** xlsx、xls、et、csv添加水印** @param 水印内容* @param 需要加水印的附件地址* @throws Exception*/public static void setWaterMarkToExcel(String 水印内容, String 需要加水印的附件地址, boolean 是否转PDF) throws Exception {String 水印文件输出的地址 = getOutputPath(需要加水印的附件地址);XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(需要加水印的附件地址));// 1、添加水印ByteArrayOutputStream byteArrayOutputStream = createWaterMark(水印内容);int pictureIdx = wb.addPicture(byteArrayOutputStream.toByteArray(), Workbook.PICTURE_TYPE_PNG);// 2、遍历sheet 给每个sheet 添加水印for (int i = 0; i < wb.getNumberOfSheets(); i++) {XSSFSheet sheet = wb.getSheetAt(i);String rID = sheet.addRelation(null, XSSFRelation.IMAGES, wb.getAllPictures().get(pictureIdx)).getRelationship().getId();sheet.getCTWorksheet().addNewPicture().setId(rID);}// 3、输出添加水印后的文件ByteArrayOutputStream bos = new ByteArrayOutputStream();wb.write(bos);wb.close();byte[] content = bos.toByteArray();OutputStream out = null;out = new FileOutputStream(水印文件输出的地址);out.write(content);bos.close();out.close();if (是否转PDF) {// 4、转PDFexcel2pdf(水印文件输出的地址, getPdfPath(需要加水印的附件地址), true);}}

下面是:类公共方法

/*** 给sheet 加水印** @param content 水印文字*/private static ByteArrayOutputStream createWaterMark(String content) throws IOException {int width = 200;int height = 150;// 1、获取bufferedImage对象BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Font font = new Font("微软雅黑", Font.BOLD, 20);// 2、获取Graphics2d对象Graphics2D g2d = image.createGraphics();image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);g2d.dispose();g2d = image.createGraphics();// 3、设置字体颜色和透明度,最后一个参数为透明度g2d.setColor(new Color(0, 0, 0, 20));// 4、设置字体g2d.setStroke(new BasicStroke(1));// 5、设置字体类型 加粗 大小g2d.setFont(font);// 6、设置倾斜度g2d.rotate(-0.5, (double) image.getWidth() / 2, (double) image.getHeight() / 2);FontRenderContext context = g2d.getFontRenderContext();Rectangle2D bounds = font.getStringBounds(content, context);double x = (width - bounds.getWidth()) / 2;double y = (height - bounds.getHeight()) / 2;double ascent = -bounds.getY();double baseY = y + ascent;// 7、写入水印文字原定高度过小,所以累计写水印,增加高度g2d.drawString(content, (int) x, (int) baseY);// 8、设置透明度g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));// 9、释放对象g2d.dispose();ByteArrayOutputStream os = new ByteArrayOutputStream();// 10、输出ImageIO.write(image, "png", os);return os;}/*** 获取 添加水印后的文件路径** @param 需要加水印的附件地址* @return*/private static String getOutputPath(String 需要加水印的附件地址) {// 1、生成水印后的PDF路径String path = 需要加水印的附件地址.substring(0, 需要加水印的附件地址.lastIndexOf(".")) + "_水印.";// 2、文件后缀String suffix = 需要加水印的附件地址.substring(需要加水印的附件地址.lastIndexOf(".") + 1);// 3、返回添加水印后的文件路径return path + suffix;}/*** 获取PDF地址** @param 需要加水印的附件地址* @return*/private static String getPdfPath(String 需要加水印的附件地址) {return 需要加水印的附件地址.substring(0, 需要加水印的附件地址.lastIndexOf(".") + 1) + "pdf";}/*** img转pdf** @param img文件路径* @param pdf的文件路径*/public static void img2pdf(String img文件路径, String pdf的文件路径, boolean 是否删除源文件) {// 验证License 若不验证则转化出的pdf文档会有水印产生if (!getLicense(2)) {return;}//新建Pdf 文档PdfDocument pdf = new PdfDocument();String[] imgUrls = img文件路径.split(",");for (int i = 0; i < imgUrls.length; i++) {//添加一页PdfPageBase page = pdf.getPages().add();//加载图片PdfImage image = PdfImage.fromFile(imgUrls[i]);double widthFitRate = image.getPhysicalDimension().getWidth() / page.getCanvas().getClientSize().getWidth();double heightFitRate = image.getPhysicalDimension().getHeight() / page.getCanvas().getClientSize().getHeight();double fitRate = Math.max(widthFitRate, heightFitRate);//图片大小double fitWidth = image.getPhysicalDimension().getWidth() / fitRate;double fitHeight = image.getPhysicalDimension().getHeight() / fitRate;//绘制图片到PDFpage.getCanvas().drawImage(image, 0, 30, fitWidth, fitHeight);}//保存文档pdf.saveToFile(pdf的文件路径);pdf.dispose();if (是否删除源文件) {del2file(img文件路径);}}/*** Ppt转pdf** @param ppt的文件路径* @param pdf的文件路径* @return*/public static void ppt2pdf(String ppt的文件路径, String pdf的文件路径, boolean 是否删除源文件) throws Exception {// 验证Licenseif (!getLicense(1)) {return;}// 输出pdf路径File file = new File(pdf的文件路径);// 输入ppt路径com.aspose.slides.Presentation pres = new com.aspose.slides.Presentation(ppt的文件路径);FileOutputStream fileOS = new FileOutputStream(file);pres.save(fileOS, com.aspose.slides.SaveFormat.Pdf);fileOS.close();//删除源文件if (是否删除源文件) {del2file(ppt的文件路径);}}/*** Word转pdf** @param word的文件路径* @param pdf的文件路径* @return*/public static void doc2pdf(String word的文件路径, String pdf的文件路径, boolean 是否删除源文件) {FileOutputStream os = null;try {// 新建一个空白pdf文档File file = new File(pdf的文件路径);os = new FileOutputStream(file);// Address是将要被转化的word文档com.spire.doc.Document doc = new com.spire.doc.Document(word的文件路径);// 保存pdf文件doc.saveToFile(os, com.spire.doc.FileFormat.PDF);// 删除源文件if (是否删除源文件) {del2file(word的文件路径);}} catch (Exception e) {e.printStackTrace();} finally {if (os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}}}/*** Excel转pdf** @param excel文件路径* @param pdf的文件路径*/public static void excel2pdf(String excel文件路径, String pdf的文件路径, boolean 是否删除源文件) throws Exception {// 验证License 若不验证则转化出的pdf文档会有水印产生if (!getLicense(2)) {return;}//读取excelcom.aspose.cells.Workbook wb = new com.aspose.cells.Workbook(excel文件路径);com.aspose.cells.PdfSaveOptions pdfSaveOptions = new com.aspose.cells.PdfSaveOptions();pdfSaveOptions.setOnePagePerSheet(true);// 遍历获取sheet数量for (int i = 0; i < wb.getWorksheets().getCount(); i++) {wb.getWorksheets().get(i).getHorizontalPageBreaks().clear();wb.getWorksheets().get(i).getVerticalPageBreaks().clear();}// 导出PDF文件wb.save(pdf的文件路径, pdfSaveOptions);//加水印调用方法//setWaterMarkToPdf("这是水印内容", pdf的文件路径, true);}/*** 删除源文件** @param 需要删除的附件地址*/public static void del2file(String 需要删除的附件地址) {String[] imgUrls = 需要删除的附件地址.split(",");for (int i = 0; i < imgUrls.length; i++) {File file2 = new File(imgUrls[i]);file2.delete();}}/*** 获取license** @return*/private static InputStream license;private static boolean getLicense(int type) {boolean result = false;try {// license路径license = WaterMarkUtils.class.getClassLoader().getResourceAsStream("License.xml");if (type == 1) {com.aspose.slides.License aposeLic = new com.aspose.slides.License();aposeLic.setLicense(license);} else {com.aspose.cells.License aposeLic = new com.aspose.cells.License();aposeLic.setLicense(license);}result = true;} catch (Exception e) {e.printStackTrace();}return result;}

为了方便代码读取,部分关键参数使用中文!!

<!-- 水印需要用到的工具类 开始--><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.4</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.9</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.7</version></dependency><dependency><groupId>com.aspose.cells</groupId><artifactId>aspose-cells</artifactId><version>8.5.5</version><scope>system</scope><systemPath>${basedir}/src/main/resources/lib/aspose-cells-8.5.2.jar</systemPath></dependency><dependency><groupId>com.aspose.words</groupId><artifactId>aspose-words</artifactId><version>words-14.9.0-jdk16</version><scope>system</scope><systemPath>${basedir}/src/main/resources/lib/aspose-words-14.9.0-jdk16.jar</systemPath></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.0.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-examples</artifactId><version>4.0.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-excelant</artifactId><version>4.0.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.0.1</version></dependency><dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId><version>3.1.0</version></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>19.0</version></dependency><dependency><groupId>e-iceblue</groupId><artifactId>spire.office.free</artifactId><version>5.3.1</version></dependency><!-- 水印需要用到的工具类 结束-->

com.aspose.cells和com.aspose.words我这里是自己下载的jar,也可使用maven仓库中的包

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。