这可能是⽬前最全的word转pdf的⼀些⽅法总结
word转pdf是⼀个⽐较⽼的话题了,⽹上有各种各样的版本,经过了各种尝试,主要是在linux和windows平台运⾏,有通过脚本的,有通过代码的,这些⽅法效果各异。
⼀、openoffice和libreoffice
这两个是开源软件,libreoffice是openoffice的⼀个分⽀,两个软件的表现,只能说是中规中矩,如果样式不是很多,且对样式没有很⾼的要求,还是基本满⾜要求的。它们两个在word转pdf的时候,⼀些样式是和Microsoft office是不兼容的,还有⼀些计算公式也要⼩⼼使⽤(⽐如⼀些页眉和页脚的计算)。
libreoffice的安装:
openoffice的安装和使⽤:
openoffice的临时启动:
/opt/openoffice4/program/soffice -headless -accept=”socket,host=127.0.0.1,port=8100;urp;” -nofirststartwizard
openoffice的永久启动:
nohup /opt/openoffice4/program/soffice -headless -accept=”socket,host=127.0.0.1,port=8100;urp;” -nofirststartwizard &
然后查看是否启动完成:ps -ef|grep openoffice
查看默认端⼝8100:netstat -lnp |grep 8100
解决中⽂乱码问题:
主要思路:乱码的主要原因是字体的不识别,所以将windows的字体拷贝到linux
word转pdf的思路,有两条:1、将linux命令写⼊到代码中 2、⽤代码启动openoffice服务进⾏转换
1、命令⽅式:参考链接:
2、代码⽅式,参考链接:
⼆、Apache的wordConverterToPdf⽅式进⾏转换
这种⽅式的转换,⽐较⿇烦,⽽且样式的⽀持不好。
package pageOffice.utils;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import llections4.MapUtils;
import org.apache.utils.StringUtils;
import org.apache.verter.pdf.PdfConverter;
import org.apache.verter.pdf.PdfOptions;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
public class WordPdfUtils {
public static void main(String[] args) throws Exception {
// String filepath = "xxxx.docx";
String filepath = "xxxx.doc";
String outpath = "xxxx.pdf";
InputStream source = new FileInputStream(filepath);
InputStream source = new FileInputStream(filepath);
OutputStream target = new FileOutputStream(outpath);
Map<String, String> params = new HashMap<String, String>();
PdfOptions options = ate();
wordConverterToPdf(source, target, options, params);
}
/**
* 将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
getsavefilename* ⽬标输出
* @param params
* 需要替换的变量
* @param options
* ate().fontEncoding( "windows-1250" ) 或者其他
* @throws Exception
*/
public static void wordConverterToPdf(InputStream source, OutputStream target, PdfOptions options,
Map<String, String> params) throws Exception {
XWPFDocument doc = new XWPFDocument(source);
Paragraphs(), params);
for (XWPFTable table : Tables()) {
for (XWPFTableRow row : Rows()) {
for (XWPFTableCell cell : TableCells()) {
Paragraphs(), params);
}
}
}
}
/** 替换段落中内容 */
private static void paragraphReplace(List<XWPFParagraph> paragraphs, Map<String, String> params) {
if (MapUtils.isNotEmpty(params)) {
for (XWPFParagraph p : paragraphs) {
for (XWPFRun r : p.getRuns()) {
String content = r.TextPosition());
if (StringUtils.isNotEmpty(content) && ainsKey(content)) {
r.(content), 0);
}
}
}
}
}
}
三、SaveAsPDFandXPS + jacob.jar + jacob.dll
效果最好的⼀种⽅法,但是需要 window 环境,⽽且速度是最慢的需要安装 msofficeWord 以及 ,这种⽅式⽬前还没有到能够在linux上运⾏的版本
代码如下:
import java.io.File;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.ComThread;
import com.jacob.Dispatch;
import com.jacob.Variant;
/**
* 效果最好的⼀种⽅法,但是需要 window 环境,⽽且速度是最慢的需要安装 msofficeWord 以及 (
* word 的⼀个插件,⽤来把 word 转化为 pdf,可以不⽤安装,本次未安装测试通过 )
*
* SaveAsPDFandXPS
* 下载地址:www.microsoft/zh-cn/download/details.aspx?id=7
* jacob 包下载地址:sourceforge/projects/jacob-project/
*
* jacob.jar 放在 E:\jdk1.5.0_14\jre\lib\ext
* jacob.dll 放在 E:\jdk1.5.0_14\jre\bin
*
* @author u Y
*
*/
public class WordToPdf {
private static final int wdFormatPDF = 17; // PDF 格式
public void wordToPDF(String sfileName, String toFileName) {
System.out.println("启动 ");
long start = System.currentTimeMillis();
ActiveXComponent app = null;
Dispatch doc = null;
try {
app = new ActiveXComponent("Word.Application");
app.setProperty("Visible", new Variant(false));
Dispatch docs = Property("Documents").toDispatch();
doc = Dispatch.call(docs, "Open", sfileName).toDispatch();
System.out.println("打开⽂档..." + sfileName);
System.out.println("转换⽂档到 " + toFileName);
File tofile = new File(toFileName);
if (ists()) {
tofile.delete();
}
Dispatch.call(doc, "SaveAs", toFileName, // FileName
wdFormatPDF);
long end = System.currentTimeMillis();
System.out.println("转换完成..⽤时:" + (end - start) + "ms.");
} catch (Exception e) {
System.out.println("========Error:⽂档转换失败:" + e.getMessage());
} finally {
Dispatch.call(doc, "Close", false);
System.out.println("关闭⽂档");
if (app != null)
app.invoke("Quit", new Variant[] {});
}
// 如果没有这句话,进程将不会关闭
ComThread.Release();
ComThread.Release();
}
public static void main(String[] args) {
WordToPdf d = new WordToPdf();
d.wordToPDF("E://test.doc", "E://test.pdf");
}
}
四:AsposeWord⽅式
该⽅式是重点推出的⽅式,效果好,⽽且跨平台,但是不是开源的,但⽹上也有⼀些绿⾊版本,⼤家在选择版本的时候,可以先试⽤,看看效果,然后再选择相应的版本,因为最新的版本可能不稳定,在测试过程中,最新版本转换pdf的时候出现空指针错误,有可能是新版本对样式的转换出现问题,⽬前⽐较好的版本是17开头的。
试⽤版和正式版的最⼤区别就是:试⽤版会有⽔印,⽽正式版没有
代码很简单的⼏⾏:
package pageOffice.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import com.aspose.words.Document;
import com.aspose.words.License;
import com.aspose.words.SaveFormat;
/**
* @author Administrator
* @version $Id$
* @since
* @see
*/
public class Word2PdfUtil {
public static void main(String[] args) {
doc2pdf("E:/test.doc","E:/ttt.pdf");
}
public static boolean getLicense() {
boolean result = false;
try {
File file = new File("E:\\l"); // 新建⼀个空⽩pdf⽂档
InputStream is = new FileInputStream(file); // l应放在..\WebRoot\WEB-INF\classes路径下 License aposeLic = new License();
aposeLic.setLicense(is);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static void doc2pdf(String inPath, String outPath) {
if (!getLicense()) { // 验证License 若不验证则转化出的pdf⽂档会有⽔印产⽣
return;
}
try {
long old = System.currentTimeMillis();
File file = new File(outPath); // 新建⼀个空⽩pdf⽂档
FileOutputStream 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("共耗时:" + ((now - old) / 1000.0) + "秒"); // 转化⽤时
} catch (Exception e) {
e.printStackTrace();
}
}
}
jar包的下载:
没有积分的童鞋可以留邮箱私发哦~
五、采⽤第三⽅技术 IText、Poi、Jsoup
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论