word转pdf

1.使用 documents4j

格式不会乱码,字体会改变

引用依赖

        <dependency>
            <groupId>com.documents4j</groupId>
            <artifactId>documents4j-local</artifactId>
            <version>1.0.3</version>
        </dependency>
        <dependency>
            <groupId>com.documents4j</groupId>
            <artifactId>documents4j-transformer-msoffice-word</artifactId>
            <version>1.0.3</version>
        </dependency>

实现代码


import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class PdfUtils {

	public static void main(String[] args) {
		pdf2png("E:\\wendang\\test","综合分析报告","png");
	}

	/**
	 * 转换全部的pdf
	 * @param fileAddress 文件地址
	 * @param filename PDF文件名
	 * @param type 图片类型
	 */
	public static void pdf2png(String fileAddress,String filename,String type) {
		// 将pdf装图片 并且自定义图片得格式大小
		File file = new File(fileAddress+"\\"+filename+".pdf");
		try {
			PDDocument doc = PDDocument.load(file);
			PDFRenderer renderer = new PDFRenderer(doc);
			int pageCount = doc.getNumberOfPages();
			for (int i = 0; i < pageCount; i++) {
				BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows native DPI
				// BufferedImage srcImage = resize(image, 240, 240);//产生缩略图
				ImageIO.write(image, type, new File(fileAddress+"\\"+filename+"_"+(i+1)+"."+type));
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}


	/**
	 *自由确定起始页和终止页
	 * @param fileAddress 文件地址
	 * @param filename pdf文件名
	 * @param indexOfStart 开始页  开始转换的页码,从0开始
	 * @param indexOfEnd 结束页  停止转换的页码,-1为全部
	 * @param type 图片类型
	 */
	public static void pdf2png(String fileAddress,String filename,int indexOfStart,int indexOfEnd,String type) {
		// 将pdf装图片 并且自定义图片得格式大小
		File file = new File(fileAddress+"\\"+filename+".pdf");
		try {
			PDDocument doc = PDDocument.load(file);
			PDFRenderer renderer = new PDFRenderer(doc);
			int pageCount = doc.getNumberOfPages();
			for (int i = indexOfStart; i < indexOfEnd; i++) {
				BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows native DPI
				// BufferedImage srcImage = resize(image, 240, 240);//产生缩略图
				ImageIO.write(image, type, new File(fileAddress+"\\"+filename+"_"+(i+1)+"."+type));
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

2.aspose-words
引用依赖

<dependency>
            <groupId>org.docx4j</groupId>
            <artifactId>docx4j-export-fo</artifactId>
            <version>8.2.4</version>
        </dependency>
        <dependency>
            <groupId>com.aspose</groupId>
            <artifactId>aspose-words</artifactId>
            <version>15.8.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/fontbox -->
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>fontbox</artifactId>
            <version>2.0.9</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox -->
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.9</version>
        </dependency>

实现代码


import com.aspose.words.Document;
import com.aspose.words.ImageSaveOptions;
import com.aspose.words.SaveFormat;

import javax.imageio.ImageIO;
import javax.imageio.stream.ImageInputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


public class AsposeUtils {


	public static void file2Img(String filePath, String imgFilePath) {
		//word2pdf("C:/Users/Administrator/Desktop/1.doc","C:/Users/Administrator/Desktop/xxxx.pdf");//word转pdf
		//word转图片格式
		try {
			File file = new File(filePath);

			InputStream inStream = new FileInputStream(file);
			List<BufferedImage> word2Img = word2Img(inStream);
			int i = 0;
			for (BufferedImage image : word2Img) {
				ImageIO.write(image, "jpg", new File(imgFilePath+i+".jpg")); //将其保存
				i++;
			}

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 验证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;
	}

	/**
	 * word和txt文件 转换 图片
	 *
	 * @param inputStream
	 * @param
	 * @return
	 * @throws Exception
	 */
	public static List<BufferedImage> word2Img(InputStream inputStream) 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张,这可以限制输出长图时的页数(方法入参可以传值pageNum)
           /*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);
				// 设置字体渲染质量
				g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
				// 从图片中读取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;
		}
	}

	/**
	 * 合并任数量的图片成一张图片
	 *
	 * @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;
	}

	/**
	 * 当文档中含有中文字符时,该段代码的执行需要调用操作系统的本地字体库支持,否则所有中文字符都将乱码。
	 * <p>
	 * 该段代码如果想要在Linux服务器上完美运行,需要给Linux服务器安装中文字体库
	 * <p>
	 * 如何在Linux环境安装Windows字体库
	 * Java使用Spire.Pdf或Aspose-Words实现Word转换Pdf在Linux服务器上的中文乱码问题
	 * 解决: https://blog.csdn.net/neulily2005/article/details/106003527
	 */
	public static boolean word2Pdf(String inPath, String outPath) {
		if (!isWordLicense()) {
			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;
	}

	/**
	 * @Description: pdf文件转换图片
	 */
	/*public static List<BufferedImage> pdf2img(InputStream inputStream) {
		try {
			PDDocument pdDocument;
			pdDocument = PDDocument.load(inputStream);
			PDFRenderer renderer = new PDFRenderer(pdDocument);
			*//* dpi越大转换后越清晰,相对转换速度越慢 *//*
			int pages = pdDocument.getNumberOfPages();
			List<BufferedImage> imageList = new ArrayList<BufferedImage>();
			for (int i = 0; i < pages; i++) {
				BufferedImage image = renderer.renderImageWithDPI(i, 300);
				imageList.add(image);
			}
			return imageList;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (inputStream != null) {
				try {
					inputStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return null;
	}*/

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值