精华内容
下载资源
问答
  • Java实现Word转PDF方案选择

    千次阅读 2018-12-27 18:10:13
    Java实现Word转PDF方案选择 很多应用场景中都会涉及到Word转PDF,但Word转PDF的方案在网上一搜一大把,让人眼花缭乱,笔者踩过无数的坑后,最终总结出以下三种方案 OpenOffice实现Word转ODF docx2pdf实现Word转ODF ...

    Java实现Word转PDF方案选择

          很多应用场景中都会涉及到Word转PDF,但Word转PDF的方案在网上一搜一大把,让人眼花缭乱,笔者踩过无数的坑后,最终总结出以下三种方案

    • OpenOffice实现Word转ODF
    • docx2pdf实现Word转ODF
    • itext+POI实现Word转ODF
    方案
    OpenOffice实现Word转ODF
    这种方案在Windows中可行,且非常简便,但它完全依赖于OpenOffice,想在Linux中实现,显然不是一个好的方案,笔者尝试过Linux中装OpenOffice,但令人发指的是居然还需要装GUI!

    Java代码

    
    import java.io.File;
    import java.io.IOException;
    import java.net.ConnectException;
    
    import com.artofsolving.jodconverter.DocumentConverter;
    import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
    import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
    import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;
    
    	/**
    	 * maven包
    	 
    		<dependency>
    			<groupId>com.artofsolving</groupId>
    			<artifactId>jodconverter-maven-plugin</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.apache.poi</groupId>
    			<artifactId>poi</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.apache.poi</groupId>
    			<artifactId>poi-ooxml</artifactId>
    		</dependency>
    		<dependency>
    		    <groupId>org.apache.poi</groupId>
    		    <artifactId>poi-scratchpad</artifactId>
    		</dependency>
    	 * 
    	 * 
    	 */
    public class OfficetoPdfUtil {
    	public static void createPDF(String sourceFile, String destFile) {
    		// String OpenOffice_HOME = "D:/Program Files/OpenOffice.org 3";//
    		// 这里是OpenOffice的安装目录,C:\Program Files (x86)\OpenOffice 4
    		String OpenOffice_HOME = "D:\\openoffice\\newgay\\";
    		Process pro = null;
    		try {
    			String command = OpenOffice_HOME
    					+ "program\\soffice.exe -headless -accept=\"socket,host=127.0.0.1,port=8300;urp;StarOffice.ServiceManager\" -nofirststartwizard";
    			pro = Runtime.getRuntime().exec(command);
    			File inputFile = new File(sourceFile);
    			// 如果目标路径不存在, 则新建该路径
    			File outputFile = new File(destFile);
    			if (!outputFile.getParentFile().exists()) {
    				outputFile.getParentFile().mkdirs();
    			}
    
    			// connect to an OpenOffice.org instance running on port 8100
    			OpenOfficeConnection connection = new SocketOpenOfficeConnection(
    					"127.0.0.1", 8300);
    			connection.connect();
    
    			// convert
    			DocumentConverter converter = new OpenOfficeDocumentConverter(
    					connection);
    			converter.convert(inputFile, outputFile);
    
    			// close the connection
    			connection.disconnect();
    			pro.destroy();
    		} catch (ConnectException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    	public static void main(String[] args) {
    		createPDF("C:\\Users\\Administrator\\Desktop\\test.doc", "C:\\Users\\Administrator\\Desktop\\test.pdf");
    	}
    }
    
    
    docx2pdf实现Word转ODF
    这种方案在Windows和Linux中都可用,但有一点需要注意,它只支持07以上的Word转换,很不幸,笔者的Word模版是03的,只能用第三种方案了。事实上,这种方案中也依赖了Itext的包

    Java代码

    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.HashMap;
    import java.util.Map;
    
    import org.apache.poi.xwpf.converter.pdf.PdfConverter;
    import org.apache.poi.xwpf.converter.pdf.PdfOptions;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    
    	/**
    	 *      2007.docx 可用      
    			maven包
    			<dependency>
    				<groupId>org.apache.poi</groupId>
    				<artifactId>poi</artifactId>
    				<version>3.15</version>
    			</dependency>
    			<dependency>
    				<groupId>org.apache.poi</groupId>
    				<artifactId>poi-ooxml</artifactId>
    				<version>3.15</version>
    			</dependency>
    			<dependency>
    				<groupId>org.apache.poi</groupId>
    				<artifactId>poi-scratchpad</artifactId>
    				<version>3.15</version>
    			</dependency>
    			<dependency>  
    				<groupId>fr.opensagres.xdocreport</groupId>  
    				<artifactId>org.apache.poi.xwpf.converter.xhtml</artifactId>  
    				<version>1.0.5</version>  
    			</dependency>
    			<dependency>
    				<groupId>fr.opensagres.xdocreport</groupId>
    				<artifactId>org.apache.poi.xwpf.converter.core</artifactId>
    				<version>1.0.6</version>
    			</dependency>
    			<dependency>
    				<groupId>fr.opensagres.xdocreport</groupId>
    				<artifactId>org.apache.poi.xwpf.converter.pdf</artifactId>
    				<version>1.0.6</version>
    			</dependency>
    
    
    			<dependency>
    				<groupId>org.xhtmlrenderer</groupId>
    				<artifactId>flying-saucer-pdf</artifactId>
    				<version>9.1.16</version>
    			</dependency>
    			<dependency>
    				<groupId>org.jsoup</groupId>
    				<artifactId>jsoup</artifactId>
    				<version>1.11.3</version>
    			</dependency>
    			<dependency>
    				<groupId>com.itextpdf.tool</groupId>
    				<artifactId>xmlworker</artifactId>
    				<version>5.5.13</version>
    			</dependency>
    			<dependency>
    				<groupId>fr.opensagres.xdocreport</groupId>
    				<artifactId>fr.opensagres.xdocreport.document</artifactId>
    				<version>1.0.5</version>
    			</dependency>
    	 * 
    	 */
    public class WordToPDF {
    	/**
    	 * 将word文档, 转换成pdf, 中间替换掉变量
    	 * 
    	 * @param source
    	 *            源为word文档, 必须为docx文档
    	 * @param target
    	 *            目标输出
    	 * @param params
    	 *            需要替换的变量
    	 * @throws Exception
    	 */
    	public static void wordConverterToPdf(InputStream source,
    			OutputStream target, Map<String, String> params) throws Exception {
    		wordConverterToPdf(source, target, null, params);
    	}
    
    	/**
    	 * 将word文档, 转换成pdf, 中间替换掉变量
    	 * 
    	 * @param source
    	 *            源为word文档, 必须为docx文档
    	 * @param target
    	 *            目标输出
    	 * @param params
    	 *            需要替换的变量
    	 * @param options
    	 *            PdfOptions.create().fontEncoding( "windows-1250" ) 或者其他
    	 * @throws Exception
    	 */
    	public static void wordConverterToPdf(InputStream source, OutputStream target, PdfOptions options,
                Map<String, String> params) throws Exception {  
    		XWPFDocument docx = new XWPFDocument(source);
    	    PdfConverter.getInstance().convert(docx, target, options);  
        }
    	public static void main(String[] args) {
    		String filepath = "C:\\Users\\Administrator\\Desktop\\test.docx";
    		String outpath = "C:\\Users\\Administrator\\Desktop\\test.pdf";
    
    		InputStream source;
    		OutputStream target;
    		try {
    			source = new FileInputStream(filepath);
    			target = new FileOutputStream(outpath);
    			Map<String, String> params = new HashMap<String, String>();
    
    			PdfOptions options = PdfOptions.create();
    
    			wordConverterToPdf(source, target, options, params);
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    	
    }
    
    
    itext+POI实现Word转ODF
    这种方案也就是先解析Word,然后将内容转换到PDF中,是三种方案中最繁琐的选择,但如果你的Word模板不是07以上的,而线上环境是Linux,这是最后的选择了

    word解析

    
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    import org.apache.poi.hwpf.HWPFDocument;
    import org.apache.poi.hwpf.usermodel.Bookmark;
    import org.apache.poi.hwpf.usermodel.Bookmarks;
    import org.apache.poi.hwpf.usermodel.Paragraph;
    import org.apache.poi.hwpf.usermodel.Range;
    import org.apache.poi.hwpf.usermodel.Section;
    import org.apache.poi.hwpf.usermodel.Table;
    import org.apache.poi.hwpf.usermodel.TableCell;
    import org.apache.poi.hwpf.usermodel.TableIterator;
    import org.apache.poi.hwpf.usermodel.TableRow;
    
    public class WordUtil {
    	public static void main(String[] args) {
    		try {
    //			InputStream is = null;
    //	        BufferedImage src = null;
    //	        int ret = -1;
    //	        
    //	        is = new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\timg.png"));
    //            src = javax.imageio.ImageIO.read(is);
    //            System.out.println(src.getHeight());
    //            System.out.println(src.getWidth());
    //            is.close();
    			new WordUtil().testReadByDoc();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    	public void testReadByDoc() throws Exception {  
    	      InputStream is = new FileInputStream("C:\\Users\\Administrator\\Desktop\\100007zldlwts.doc");
    	      HWPFDocument doc = new HWPFDocument(is);
    	      //输出书签信息  
    	      this.printInfo(doc.getBookmarks(), doc);  
    	      //输出文本  
    //	      System.out.println(doc.getDocumentText());  
    //	      Range range = doc.getRange();  
    //	      this.insertInfo(range);  
    //	      this.printInfo(range);  
    //	      //读表格  
    //	      this.readTable(range);  
    //	      //读列表  
    //	      this.readList(range);  
    //	      //删除range  
    //	      Range r1 = new Range(0, 1048, doc);  
    //	      r1.delete();//在内存中进行删除,如果需要保存到文件中需要再把它写回文件
    	      
    //	                 把当前HWPFDocument写到输出流中  
    //	      doc.write(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\100006bzsupdated.doc"));  
    	      this.closeStream(is);  
    	   }  
    	    
    	   /** 
    	    * 关闭输入流 
    	    * @param is 
    	    */  
    	   private void closeStream(InputStream is) {  
    	      if (is != null) {  
    	         try {  
    	            is.close();  
    	         } catch (IOException e) {  
    	            e.printStackTrace();  
    	         }  
    	      }  
    	   }  
    	    
    	   /** 
    	    * 输出书签信息 
    	    * @param bookmarks 
    	 * @param doc 
    	    */  
    	   private void printInfo(Bookmarks bookmarks, HWPFDocument doc) {  
    	      int count = bookmarks.getBookmarksCount();  
    	      System.out.println("书签数量:" + count);  
    	      Bookmark bookmark;  
    	      for (int i=0; i<count; i++) {  
    	         bookmark = bookmarks.getBookmark(i);  
    	         System.out.println("书签" + (i+1) + "的名称是:" + bookmark.getName());  
    	         System.out.println("开始位置:" + bookmark.getStart());  
    	         System.out.println("结束位置:" + bookmark.getEnd());  
    	         System.out.println(new Range(bookmark.getStart(), bookmark.getEnd(), doc).text().replaceAll(" FORMTEXT ", "").replaceAll("", ""));
    	      }  
    	   }  
    	    
    	   /** 
    	    * 读表格 
    	    * 每一个回车符代表一个段落,所以对于表格而言,每一个单元格至少包含一个段落,每行结束都是一个段落。 
    	    * @param range 
    	    */  
    	   private void readTable(Range range) {  
    	      //遍历range范围内的table。  
    	      TableIterator tableIter = new TableIterator(range);  
    	      Table table;  
    	      TableRow row;  
    	      TableCell cell;  
    	      while (tableIter.hasNext()) {  
    	         table = tableIter.next();  
    	         int rowNum = table.numRows();  
    	         for (int j=0; j<rowNum; j++) {  
    	            row = table.getRow(j);  
    	            int cellNum = row.numCells();  
    	            for (int k=0; k<cellNum; k++) {  
    	                cell = row.getCell(k);  
    	                //输出单元格的文本  
    	                System.out.println(cell.text().trim());  
    	            }  
    	         }  
    	      }  
    	   }  
    	    
    	   /** 
    	    * 读列表 
    	    * @param range 
    	    */  
    	   private void readList(Range range) {  
    	      int num = range.numParagraphs();  
    	      Paragraph para;  
    	      for (int i=0; i<num; i++) {  
    	         para = range.getParagraph(i);  
    	         if (para.isInList()) {  
    	            System.out.println("list: " + para.text());  
    	         }  
    	      }  
    	   }  
    	    
    	   /** 
    	    * 输出Range 
    	    * @param range 
    	    */  
    	   private void printInfo(Range range) {  
    	      //获取段落数  
    	      int paraNum = range.numParagraphs();  
    	      System.out.println(paraNum);  
    	      for (int i=0; i<paraNum; i++) {  
    	         //this.insertInfo(range.getParagraph(i));  
    	         System.out.println("段落" + (i+1) + ":" + range.getParagraph(i).text());  
    	         if (i == (paraNum-1)) {  
    	            this.insertInfo(range.getParagraph(i));  
    	         }  
    	      }  
    	      int secNum = range.numSections();  
    	      System.out.println(secNum);  
    	      Section section;  
    	      for (int i=0; i<secNum; i++) {  
    	         section = range.getSection(i);  
    	         System.out.println(section.getMarginLeft());  
    	         System.out.println(section.getMarginRight());  
    	         System.out.println(section.getMarginTop());  
    	         System.out.println(section.getMarginBottom());  
    	         System.out.println(section.getPageHeight());  
    	         System.out.println(section.text());  
    	      }  
    	   }  
    	    
    	   /** 
    	    * 插入内容到Range,这里只会写到内存中 
    	    * @param range 
    	    */  
    	   private void insertInfo(Range range) {  
    	      range.insertAfter("Hello");  
    	   }  
    
    }
    
    

    pdf生成

    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    
    import com.itextpdf.text.BaseColor;
    import com.itextpdf.text.Chunk;
    import com.itextpdf.text.Document;
    import com.itextpdf.text.DocumentException;
    import com.itextpdf.text.Element;
    import com.itextpdf.text.Font;
    import com.itextpdf.text.Image;
    import com.itextpdf.text.PageSize;
    import com.itextpdf.text.Paragraph;
    import com.itextpdf.text.Phrase;
    import com.itextpdf.text.Rectangle;
    import com.itextpdf.text.pdf.BaseFont;
    import com.itextpdf.text.pdf.ColumnText;
    import com.itextpdf.text.pdf.PdfPageEventHelper;
    import com.itextpdf.text.pdf.PdfTemplate;
    import com.itextpdf.text.pdf.PdfWriter;
    
    public class PDFUtil {
    	public static void main(String[] args) throws Exception {
    		OutputStream out = new FileOutputStream(new File("C:\\Users\\Administrator\\Desktop\\test.pdf"));
    
    		BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); 
    		Font BlodFont = new Font(bfChinese, 12, Font.NORMAL, BaseColor.BLACK);
    		
    		Document document = new Document(PageSize.A4);
    		// 写入器
    		PdfWriter writer = PdfWriter.getInstance(document, out);
    		document.open();
    		
    		Paragraph paragraphRemark = new Paragraph();
    		paragraphRemark.setFirstLineIndent(2f);
    	    paragraphRemark.add(new Chunk("特别提醒:", BlodFont));
    	    paragraphRemark.add(Chunk.NEWLINE);
    	    document.add(paragraphRemark);
    	    
    	    Image img = Image.getInstance("C:\\Users\\Administrator\\Desktop\\图片1.png");
    	    img.scaleToFit(400f,200f);
    	    document.add(img);
    	    
    	    HeaderFoot headerFoot = new HeaderFoot("Title");
            writer.setPageEvent(headerFoot);
            
            
    	    document.close();
    	    writer.close();
            out.flush();
    	}
    }
    
    class HeaderFoot extends PdfPageEventHelper {
        private String header;
     
        public HeaderFoot(String header) {
    		this.header = header;
    	}
    
        @Override
        public void onEndPage(PdfWriter writer, Document document) {
            BaseFont baseFont = null;
            try {
                baseFont = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            } catch (DocumentException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            Font BlodFont = new Font(baseFont, 16, Font.BOLD, BaseColor.BLACK);
            Rectangle rect = writer.getBoxSize("art");
            //添加页眉
            ColumnText.showTextAligned(writer.getDirectContent(),
                    Element.ALIGN_CENTER, new Phrase(header, BlodFont),
                    document.left() + 260, document.top(), 0);
     
        }
    }
    
    
    展开全文
  • Java 实现word转pdf

    2019-11-06 09:24:57
    word转pdf我在网上了一天,始终找不到适合自己的!! 我擦!我太难了,写此博客分享给你们,也以免我忘记 我用的是jacob一个jar包就可以了 步骤: 下jar包 实现代码 jar包地址:亲测有效 ...这两个文件放到你jdk和...

    word转pdf我在网上转了一天,始终找不到适合自己的!!
    我擦!我太难了,写此博客分享给你们,也以免我忘记

    我用的是jacob一个jar包就可以了
    步骤:

    1. 下jar包
    2. 实现代码

    jar包地址:亲测有效

    https://sourceforge.net/projects/jacob-project/

    注意:下载好后一定要将
    在这里插入图片描述
    这两个文件放到你jdk和jre的bin目录下,不然会报空指针异常

    直接上代码

    /**
     * 
     * @param wordFile 代表word文档路径
     * @param pdfFile  代表你转换成pdf最后存储的路径
     */
    public static void wToPdfChange(String wordFile, String pdfFile) {// wordFile word 的路径 //pdfFile pdf 的路径
    
        ActiveXComponent app = null;
        System.out.println("开始转换...");
        // 开始时间
        // long start = System.currentTimeMillis();
        try {
            // 打开word
            app = new ActiveXComponent("Word.Application");
            // 获得word中所有打开的文档
            Dispatch documents = app.getProperty("Documents").toDispatch();
            System.out.println("打开文件: " + wordFile);
            // 打开文档
            Dispatch document = Dispatch.call(documents, "Open", wordFile, false, true).toDispatch();
            // 如果文件存在的话,不会覆盖,会直接报错,所以我们需要判断文件是否存在
            File target = new File(pdfFile);
            if (target.exists()) {
                target.delete();
            }
            System.out.println("另存为: " + pdfFile);
            Dispatch.call(document, "SaveAs", pdfFile, 17);
            // 关闭文档
            Dispatch.call(document, "Close", false);
        } catch (Exception e) {
            System.out.println("转换失败" + e.getMessage());
        } finally {
            // 关闭office
            app.invoke("Quit", 0);
        }
    }
    
    public static void main(String[] args) {
        String word = "D:/巨好贷需求文档(重点).docx";
        String name = "zlz".concat(".pdf");
        String pdf = "D:\\" + name;
        wToPdfChange(word, pdf);
    }
    

    方法的两个参数的意思 在方法注释上面有

    接下来就是maven如何引用这个jar包,这个jar包我也在maven仓库找过不是我想要的所以用普通的maven依赖是不行滴~所以我们需要手动添加jar包

    1. 项目右击打开open maven setting
      在这里插入图片描述
    2. 找到libraries->java手动添加jar包
      在这里插入图片描述然后就可以使用了

    注意 runmaven test的时候会报错 找不到你手动添加的jar包
    具体解决方案我给你们一条链接,我也是这样解决的

    https://blog.csdn.net/fenglongmiao/article/details/80703618
    写的挺好的

    展开全文
  • Java实现word转PDF文件

    2018-07-02 19:14:28
    java实现word文件PDF文件,支持doc后缀文件和docx文件,使用时jar文件手动加入,dll文件copy到jdk的bin目录下。dll文件一定要放到jdk目录下!!!
  • java实现word转pdf

    2018-05-18 16:38:43
    最近遇到一个项目需要把word pdf,百度了一下网上的方案有很多,比如虚拟打印、给word 装扩展插件等,这些方案都依赖于ms word 程序,在java代码中也得使用诸如jacob或jcom这类java com bridge,使得服务器开发...

    最近遇到一个项目需要把word 转成pdf,百度了一下网上的方案有很多,比如虚拟打印、给word 装扩展插件等,这些方案都依赖于ms word 程序,在java代码中也得使用诸如jacob或jcom这类java com bridge,使得服务器开发受限于win平台,而且部署起来也很麻烦。后来在某论坛看到了一个openoffice+jodconverter的转换方案,可以完成word到PDF的转换工作,服务器开发端需要安装openoffice,但是需求一步额外的操作--需要在服务器开发上的某个端口提供一个openoffice服务,这对部署起来显得麻烦了点,貌似也不太安全。
      偶然机会发现了PageOffice组件也可以实现word转pdf功能。而且不只是简单的把word转为pdf格式,还可以支持动态填充数据到word模板文件然后再转为pdf文件。
      以下为官网介绍:

      

      调用PageOffice组件的FileMaker对象实现动态填充数据到word模板并转为pdf的核心代码如下:

    复制代码
        FileMakerCtrl fmCtrl = new FileMakerCtrl(request);
        fmCtrl.setServerPage(request.getContextPath()+"/poserver.zz");
        WordDocument doc = new WordDocument();
        doc.openDataRegion("PO_company").setValue("北京某某有限公司");//给数据区域赋值,即把数据填充到模板中相应的位置
        fmCtrl.setSaveFilePage("/savepdf"); //保存pdf的action或RequestMapping方法
        fmCtrl.setWriter(doc);
        fmCtrl.fillDocumentAsPDF("doc/template.doc", DocumentOpenType.Word, "123.pdf");//填充word模板并转为pdf
    复制代码
      保存pdf的action或RequestMapping方法(/savepdf)的代码:
        FileSaver fs = new FileSaver(request, response);
        fs.saveToFile(request.getSession().getServletContext().getRealPath("doc") +"/"+ fs.getFileName());
        fs.close();

      示例源码及效果:http://www.zhuozhengsoft.com/dowm/,下载PageOffice for Java,解压后,拷贝Samples4文件夹到Tomcat的Webapps目录下,访问:http://localhost:8080/Samples4/index.html,查看示例:二、34、FileMaker转换单个文档为PDF(以Word为例) 

    展开全文
  • JAVA实现WORD转PDF

    2019-10-15 18:15:39
    2、笔者采坑记录:jacob也可以实现word转PDF且Jacob是不收费的,但是Jacob只支持windows,不支持linux。 3、参考博客: Java利用aspose-words将word文档转换成pdf(破解 无水印) 使用com.aspose.w...

    1、使用aspose-words,这是个收费的,需要购买获取license.xml中的秘钥,本文只介绍使用方法,请支持正版apose官网
    2、笔者采坑记录:jacob也可以实现word转PDF且Jacob是不收费的,但是Jacob只支持windows,不支持linux
    3、参考博客:
    Java利用aspose-words将word文档转换成pdf(破解 无水印)
    使用com.aspose.words将word模板转为PDF乱码解决方案(window下正常)

    一、jar包依赖

    1、jar包获取地址
    链接: jar包下载 提取码: mp59
    2、jar包添加到本地maven仓库
    jar包下载之后进入到命令行执行:

    mvn install:install-file -Dfile=aspose-words-15.8.0-jdk16.jar -DgroupId=com.jcraft -DartifactId=aspose-words -Dversion=15.8.0-jdk16 -Dpackaging=jar
    

    执行完毕之后可以看到本地maven仓库中生成了com.jcraft.aspose-words路径的文件
    3、引用依赖

            <!-- word2pdf -->
            <dependency>
                <groupId>com.jcraft</groupId>
                <artifactId>aspose-words</artifactId>
                <version>15.8.0-jdk16</version>
            </dependency>
    

    二、license.xml

    license.xml放到项目根目录下。

    <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>---</SerialNumber>
        </Data>
        <Signature>---</Signature>
    </License>
    

    三、Java代码

    
        /**
         * word 转 PDF
         *
         * @param wordPath word路径
         * @param pdfPath  pdf路径
         */
        private void word2pdf(String wordPath, String pdfPath) {
            // 验证License 若不验证则转化出的pdf文档会有水印产生
            if (WordUtil.getLicense()) {
                try {
                    long old = System.currentTimeMillis();
                    //新建一个空白pdf文档
                    File file = new File(pdfPath);
                    FileOutputStream os = new FileOutputStream(file);
                    Document doc = new Document(wordPath);
                    //设置一个字体目录(必须设置,否则生成的pdf乱码)下面这行代码不加的话在windows系统下生成的pdf不存在乱码问题,但是在linux系统下会乱码,linux下乱码解决方案请看后面的解决方案
                    //FontSettings.setFontsFolder("/usr/share/fonts/chinese", false);
                    doc.save(os, SaveFormat.PDF);
                    os.close();
                    long now = System.currentTimeMillis();
                    logger.info("word2pdf共耗时:{}秒", ((now - old) / 1000.0));
                } catch (Exception e) {
                    logger.error("word2pdf异常", e);
                    e.printStackTrace();
                }
            }
        }
        /**
         *  WordUtil.getLicense()
         * 判断是否有授权文件 如果没有则会认为是试用版,转换的文件会有水印
         */
        public static boolean getLicense() {
            boolean result = false;
            try {
                InputStream is = WordUtil.class.getClassLoader().getResourceAsStream("license.xml");
                License aposeLic = new License();
                aposeLic.setLicense(is);
                result = true;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return result;
        }
    

    四、Linux乱码解决(pdf中文被小方框代替了)

    参考:使用com.aspose.words将word模板转为PDF乱码解决方案(window下正常)

    1、问题详情

    使用com.aspose.words将word模板转为PDF文件时,在开发平台window下转换没有问题,中文也不会出现乱码。但是将服务部署在正式服务器(Linux)上,转换出来的PDF中文就出现了乱码。

    2、问题分析

    在window下没有问题但是在linux下有问题,就说明不是代码或者输入输出流编码的问题,根本原因是两个平台环境的问题。出现乱码说明linux环境中没有相应的字体以供使用,所以就会导致乱码的出现。将转换无问题的windos主机中的字体拷贝到linux平台下进行安装,重启服务器后转换就不会出现乱码了。

    3、解决方案

    Windows下字体库的位置为C:\Windows\fonts
    linux的字体库是 /usr/share/fonts
    步骤:
    a、将windows下的字体上传到linux上:/usr/share/fonts/chinese
    b、执行以下命令

    cd /usr/share/fonts/chinese/
    chmod 755 /usr/share/fonts/chinese/*
    yum install mkfontscale
    mkfontscale
    mkfontdir
    fc-cache
    

    c、将上面代码中//FontSettings.setFontsFolder("/usr/share/fonts/chinese", false);的注释放开

    展开全文
  • java实现word转pdf在线预览格式 前段时间的项目里涉及了此功能,调研过一些方案,踩过一些坑,一一总结在此。 java转pdf方案很多,但是很多都要收费,转pdf也有一些格式方面的问题。 方案对比: poi格式错乱 ...
  • Aspose.Words Java实现word转pdf文件(高效不失真)。提供license文件。提供源代码。提供jar。下载即可直接使用。Word2PdfUtil.java、license.xml、Aspose.Words-jdk16.jar
  • [转载]java实现word转pdf

    2018-05-10 14:36:20
    最近遇到一个项目需要把word pdf,百度了一下网上的方案有很多,比如虚拟打印、给word 装扩展插件等,这些方案都依赖于ms word 程序,在java代码中也得使用诸如jacob或jcom这类java com bridge,使得服务器开发...
  • JavaWord转PDF解决方案

    千次阅读 2020-03-18 11:24:20
    一、实现功能 1、doc、docx都可转换为PDF 2、word含有中文的转换为PDF后可显示 二、转换步骤 word —> html —> pdf 三、使用工具(Jar包) 1、poi、itext(如下maven配置) 作用:poi:用于将word转换...
  • [原创]java实现word转pdf

    2018-05-08 17:26:00
    最近遇到一个项目需要把word pdf,百度了一下网上的方案有很多,比如虚拟打印、给word 装扩展插件等,这些方案都依赖于ms word 程序,在java代码中也得使用诸如jacob或jcom这类java com bridge,使得服务器开发...
  • 最近遇到一个项目需要把word转pdf,GOOGLE了一下网上的方案有很多,比如虚拟打印、给word装扩展插件等,这些方案都依赖于ms word程序,在java代码中也得使用诸如jacob或jcom这类Java COM Bridge,使得服务器受限于...
  • Java语言实现word转PDF

    2019-11-15 15:07:53
    基本上涉及到Java操作office的时候就会想到POI和openoffice.这两种方案都是需要找各种jar包,然后用里面繁杂的api。关键是做出来的文件格式有各种各样的问题,有时生成的文件打不开,有时文档格式混乱。搞了好几天的....
  • java word 转pdf格式

    2017-08-25 18:18:46
    java快捷word转换pdf方案
  • 两种方案实现word转pdf

    2020-07-07 11:38:11
    目前常见的实现word转pdf的方式有两种,第一种是使用第三方插件安装调用;第二种是使用免费的jar包。但两种方式均有利有弊。安装第三方插件很明显需要安装插件,然后还要收费。第二种免费的jar包,一来比较难以寻找...
  • javaweb 在线预览word如何实现幸运,我开发过又看到这个题。开始我用的是openoffice,需要安装这个软件,再用java调用这样。后面忘记出现了什么问题。改用xcode,都是免费的,这个更方便,这是相当于另一个部署项目...
  • import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import org.aspectj.weaver.ast.Test; import com.aspose.words.Document; import com.aspose.words.License; i.....
  • How can I convert a pdf file to word file using Java?And, is it as easy as it looks like?解决方案public class PDFTextReader{static String pdftoText(String fileName) {PDFParser parser;String parsedText...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,892
精华内容 3,156
关键字:

java实现word转pdf方案选择

java 订阅