Java使用word文档转换图片或pdf格式(aspose-words),无水印,亲测有效!!!

@TOCJava使用word文档转换图片或pdf格式,需要使用(aspose-words-15.8.0-jdk16.jar),版本要对应,无水印。

研究了好几种方式,其中aspose-words和spire.doc是能够成功运行的,本片文章贴出的是aspose-words的方法和代码。

  1. 需要准备aspose-words-15.8.0-jdk16.jar
    成功解决问题的我也分享一下百度网盘下载路径:
    点击跳转链接 :https://pan.baidu.com/s/1pQkTB4Mx8ZV-KbCMmjLaQQ 提取码: bgat

下面我每个框丢一个方法出来,并且做出相应的解析

  1. 引用的是这些文件(因为有很多相似容易引用错,平时我也是找得有点麻烦,所以在这里贴出来了)
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageInputStream;
import com.aspose.words.Document;
import com.aspose.words.ImageSaveOptions;
import com.aspose.words.License;
import com.aspose.words.SaveFormat;
  1. 验证授权(其他jar有试过,但是没有对应的license.xml,是有水印的。下面这个是对应版本的了,所以转出来的图片才没有水印)
  /**
     * 验证aspose.word组件是否授权:无授权的文件有水印标记
     * 需要使用(aspose-words-15.8.0-jdk16.jar),版本要对应。无水印
     * @return
     */
    public static boolean isWordLicense() {
        boolean result = false;
        try {
        	String s = "<License><Data><Products><Product>Aspose.Total for Java</Product><Product>Aspose.Words for Java</Product></Products><EditionType>Enterprise</EditionType><SubscriptionExpiry>20991231</SubscriptionExpiry><LicenseExpiry>20991231</LicenseExpiry><SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber></Data><Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature></License>";
        	ByteArrayInputStream inputStream = new ByteArrayInputStream(s.getBytes());
            com.aspose.words.License license = new com.aspose.words.License();
            license.setLicense(inputStream);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    
	//outputStream转inputStream
    public static ByteArrayInputStream parse(OutputStream out) throws Exception {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        baos = (ByteArrayOutputStream) out;
        ByteArrayInputStream swapStream = new ByteArrayInputStream(baos.toByteArray());
        return swapStream;
    }
  1. wor转换图片,中间我加了一段是再转换一边图片的,因为直接==javax.imageio.ImageIO.read(imageInputStream)==输出的图片底色为红色,也就是我改了下图片的底色再进行输出这样子啦。
   /**
    * word和txt文件转换图片
    * @param inputStream
    * @param pageNum
    * @return
    * @throws Exception
    */
   private static List<BufferedImage> wordToImg(InputStream inputStream, int pageNum) throws Exception {
   	if (!isWordLicense()) {
           return null;
       }
       try {
       	Date start = new Date();
           Document doc = new Document(inputStream);
           ImageSaveOptions options = new ImageSaveOptions(SaveFormat.PNG);
           options.setPrettyFormat(true);
           options.setUseAntiAliasing(true);
           options.setUseHighQualityRendering(true);
           int pageCount = doc.getPageCount();
           //生成前pageCount张,这可以限制输出长图时的页数
           /*if (pageCount > pageNum) {
               pageCount = pageNum;
           }*/
           List<BufferedImage> imageList = new ArrayList<BufferedImage>();
           for (int i = 0; i < pageCount; i++) {
               OutputStream output = new ByteArrayOutputStream();
               options.setPageIndex(i);

               doc.save(output, options);
               ImageInputStream imageInputStream = javax.imageio.ImageIO.createImageInputStream(parse(output));
               imageList.add(javax.imageio.ImageIO.read(imageInputStream));
           }
           List<BufferedImage> imageList2 = new ArrayList<BufferedImage>();
           //这个重新生成新的图片是因为直接输出的图片底色为红色
           for(int j=0; j<imageList.size(); j++){
           	// 生成新图片
               BufferedImage destImage = imageList.get(j);            
               int w1 = destImage.getWidth();
               int h1 = destImage.getHeight();               
               destImage = new BufferedImage(w1, h1, BufferedImage.TYPE_INT_RGB);
               Graphics2D g2 = (Graphics2D) destImage.getGraphics();
               g2.setBackground(Color.LIGHT_GRAY);
               g2.clearRect(0, 0, w1, h1);
               g2.setPaint(Color.RED);
               // 从图片中读取RGB
               int[] ImageArrayOne = new int[w1 * h1];
               ImageArrayOne = imageList.get(j).getRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 逐行扫描图像中各个像素的RGB到数组中
               destImage.setRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB
               imageList2.add(destImage);
           }
           Date end = new Date();
           long l=end.getTime()-start.getTime();
           long hour= l / (1000 * 60 * 60);
           long min=  (l-hour*(1000 * 60 * 60 ))/(1000* 60);
           long s= (l-hour*(1000 * 60 * 60 )-min*1000*60)/(1000);
           long ss= (l-hour*(1000 * 60 * 60 )-min*1000*60 -s*1000)/(1000/60);
           System.out.println("word转图片时间:"+min+"分"+s+"秒" + ss + "毫秒");//hour+"小时"+
           return imageList2;
       } catch (Exception e) {
           e.printStackTrace();
           throw e;
       }
   }
  1. word转pdf,这个就直接用就行啦
 /**
     * word转pdf
     * @param docPath
     * @param savePath
     */
    public static void word2pdf(String docPath,String savePath){
	    	try {
	    	String s = "<License><Data><Products><Product>Aspose.Total for Java</Product><Product>Aspose.Words for Java</Product></Products><EditionType>Enterprise</EditionType><SubscriptionExpiry>20991231</SubscriptionExpiry><LicenseExpiry>20991231</LicenseExpiry><SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber></Data><Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature></License>";
	    	ByteArrayInputStream is = new ByteArrayInputStream(s.getBytes());
	    	License license = new License();
	    	license.setLicense(is);
	    	Document document = new Document(docPath);
	    	document.save(new FileOutputStream(new File(savePath)),SaveFormat.PDF);
	    	} catch (Exception e) {   		
	    		e.printStackTrace();
	    	}
    }
  1. 合并图片,合并为长图。可以控制合并的数量哦
   /**
    * 合并任数量的图片成一张图片
    * @param isHorizontal true代表水平合并,fasle代表垂直合并
    * @param imgs 待合并的图片数组
    * @return
    * @throws IOException
    */
   public static BufferedImage mergeImage(boolean isHorizontal, List<BufferedImage> imgs) throws IOException {
       // 生成新图片
       BufferedImage destImage = null;
       // 计算新图片的长和高
       int allw = 0, allh = 0, allwMax = 0, allhMax = 0;
       // 获取总长、总宽、最长、最宽
       for (int i = 0; i < imgs.size(); i++) {
           BufferedImage img = imgs.get(i);
           allw += img.getWidth();

          if (imgs.size() != i + 1) {
               allh += img.getHeight() + 5;
           } else {
               allh += img.getHeight();
           } 
           if (img.getWidth() > allwMax) {
               allwMax = img.getWidth();
           }
           if (img.getHeight() > allhMax) {
               allhMax = img.getHeight();
           }
       }
       // 创建新图片
       if (isHorizontal) {
           destImage = new BufferedImage(allw, allhMax, BufferedImage.TYPE_INT_RGB);
       } else {
           destImage = new BufferedImage(allwMax, allh, BufferedImage.TYPE_INT_RGB);
       }
       Graphics2D g2 = (Graphics2D) destImage.getGraphics();
       g2.setBackground(Color.LIGHT_GRAY);
       g2.clearRect(0, 0, allw, allh);
       g2.setPaint(Color.RED);

       // 合并所有子图片到新图片
       int wx = 0, wy = 0;
       for (int i = 0; i < imgs.size(); i++) {
           BufferedImage img = imgs.get(i);
           int w1 = img.getWidth();
           int h1 = img.getHeight();
           // 从图片中读取RGB
           int[] ImageArrayOne = new int[w1 * h1];
           ImageArrayOne = img.getRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 逐行扫描图像中各个像素的RGB到数组中
           if (isHorizontal) { // 水平方向合并
               destImage.setRGB(wx, 0, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB
           } else { // 垂直方向合并
               destImage.setRGB(0, wy, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB
           }
           wx += w1;
           wy += h1 + 5;
       }

       return destImage;
   }
  1. 测试方法

   public class test {		
   /**
    * 测试代码
    * @param args
    */
       public static void main(String[] args){
   	    	//word转图片格式
   	    	try {
   				File file = new File("C:/Users/Administrator/Desktop/1.docx"); 
   				InputStream inStream = new FileInputStream(file);
   				List<BufferedImage> wordToImg = wordToImg(inStream,2);//			
   				for(int i=0; i<wordToImg.size(); i++){
   					//保存图片(单张)
   					ImageIO.write(wordToImg.get(i), "jpg", new File("I:/"+ i +".png")); //将其保存在C:/imageSort/targetPIC/下			       
   				}
   				BufferedImage mergeImage = mergeImage(false, wordToImg);
   				//保存图片(长图)
   				ImageIO.write(mergeImage, "jpg", new File("I:/xx.png"));     
   			} catch (Exception e) {
   				e.printStackTrace();
   			}
       }

		//上面贴出的方法,用到哪个就放哪个进来测试就好啦,放在一起测试就没那么麻烦! 

   }
  • 4
    点赞
  • 9
    收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论 1

打赏作者

一朵可爱的霸王fa

谢啦!继续加油(ง •_•)ง

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值