需求:需要给word添加水印,然后将word转成pdf,
记住:是添加水印然后转换文件格式,这个有坑
文档操作基本网上方案都是spiredoc aspose poi
之前项目文档转换用的spiredoc直接用了,水印之前只是了解过spiredoc可以实现,直接用的spiredoc来添加水印
生产跑了几天发现正常,突然有一次报错了,发现是因为文件大于3页,spiredoc免费版文件转换不能超过3页
然后就把文件转换改成了spiredoc,最终结果是:使用spiredoc添加水印,然后使用aspose来实现文件转换
继续上线,项目跑了几天,一切ok
本地测试,ok
直接上线,生产一直卡在文件转换,添加水印没问题,转换直接报错,说读到文件末尾什么的,经验证,添加水印的文件是存在的
一开始是怀疑文件格式有问题,将生产文件拿到本地,直接用wps等打开发现没有问题
一时不知道如何解决
一直查问题,丝毫没有任何头绪
换各种j版本的jar,都失败
最后直接用生产文件在本地转换发现也是不行
然后就怀疑是spiredoc和aspose之间不兼容
然后就尝试只用aspose,验证成功,证明spiredoc和aspose之间不兼容
package pers.wwz;
import com.aspose.words.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
public class Word2PdfAsposeUtil2 {
public static boolean getLicense() {
boolean result = false;
try {
InputStream is = Word2PdfAsposeUtil2.class.getClassLoader().getResourceAsStream("license.xml"); // license.xml应放在..\WebRoot\WEB-INF\classes路径下
License aposeLic = new License();
aposeLic.setLicense(is);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static void addWaterMask2() throws Exception {
//1.有一个源文件
File f=new File("1.png");
//2.将一个字节流 这个管怼到源文件上
FileInputStream fp=new FileInputStream(f);
Document doc = new Document("1.doc");
//图片水印
ImageWatermarkOptions imageWatermarkOptions = new ImageWatermarkOptions();
imageWatermarkOptions.setScale(1);//设置图片比例
imageWatermarkOptions.isWashout(false);//设置对图片进行水洗(淡化颜色效果)
BufferedImage bufferedImage = ImageIO.read(fp);
doc.getWatermark().setImage(bufferedImage, imageWatermarkOptions);
doc.save("2.doc");
}
public static boolean doc2pdf(String inPath, String outPath) {
System.out.println("inPath1234="+inPath);
System.out.println("outPath12="+outPath);
//if (!getLicense()) { // 验证License 若不验证则转化出的pdf文档会有水印产生
// return false;
// }
FileOutputStream os = null;
try {
long old = System.currentTimeMillis();
File file = new File(outPath); // 新建一个空白pdf文档
os = new FileOutputStream(file);
Document doc = new Document(inPath); // Address是将要被转化的word文档
doc.save(os, SaveFormat.PDF);// 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,
// EPUB, XPS, SWF 相互转换
long now = System.currentTimeMillis();
System.out.println("pdf转换成功,共耗时:" + ((now - old) / 1000.0) + "秒"); // 转化用时
} catch (Exception e) {
e.printStackTrace();
return false;
}finally {
if (os != null) {
try {
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return true;
}
public static void main(String[] args) throws Exception {
addWaterMask2();
Word2PdfAsposeUtil2.doc2pdf("2.doc", "2.pdf");
}
}