最近因为要用freemarker 生成wrod文件,在转pdf 在线预览后是xml我先把freemarker 生成的文件转成docx在转pdf
doc转docx
XmlDocToDocxUtil类
/**
* 转换xml格式的doc文档为docx
*/
public class XmlDocToDocxUtil {
private XmlDocToDocxUtil(){};
/**
* 转换执行方法,转换后和原始路径
* @param xmlPath 原始路径
*/
public static String invoke(String xmlPath){
if(xmlPath.endsWith(".doc")){
//DOC文档才转换
String docxPath = xmlPath.replaceAll(Constant.CONVERT_SUF,Constant.DOCX_SUF);
try(FileInputStream inputStream = new FileInputStream(xmlPath);){
WordprocessingMLPackage wmlPackage = Docx4J.load(inputStream);
//转换为DOCX
try(FileOutputStream docx = new FileOutputStream(docxPath);){
Docx4J.save(wmlPackage, docx, Docx4J.FLAG_SAVE_ZIP_FILE);
xmlPath = docxPath;
}
} catch (Exception e) {
LogUtil.getLogger().error(xmlPath+":不需要转换:"+e.getLocalizedMessage());
}
}
LogUtil.getLogger().info("WORD 路径:"+xmlPath);
return xmlPath;
}
}
LogUtil 类
public class LogUtil {
private static Logger logger = Logger.getLogger(LogUtil.class);
public static Logger getLogger(){
return logger;
}
}
Constant 类
public class Constant {
public final static String DOC_SUF = ".doc";
public final static String DOCX_SUF = ".docx";
public final static String PDF_SUF = ".pdf";
public final static String CONVERT_SUF = "(\\.docx)|(\\.doc)";
}
docx 转pdf
Converter
public abstract class Converter {
private final String LOADING_FORMAT = "\nLoading stream\n\n";
private final String PROCESSING_FORMAT = "Load completed in %1$dms, now converting...\n\n";
private final String SAVING_FORMAT = "Conversion took %1$dms.\n\nTotal: %2$dms\n";
private long startTime;
private long startOfProcessTime;
protected InputStream inStream;
protected OutputStream outStream;
protected boolean showOutputMessages = false;
protected boolean closeStreamsWhenComplete = true;
public Converter(InputStream inStream, OutputStream outStream, boolean showMessages, boolean closeStreamsWhenComplete){
this.inStream = inStream;
this.outStream = outStream;
this.showOutputMessages = showMessages;
this.closeStreamsWhenComplete = closeStreamsWhenComplete;
}
public abstract void convert() throws Exception;
private void startTime(){
startTime = System.currentTimeMillis();
startOfProcessTime = startTime;
}
protected void loading(){
sendToOutputOrNot(String.format(LOADING_FORMAT));
startTime();
}
protected void processing(){
long currentTime = System.currentTimeMillis();
long prevProcessTook = currentTime - startOfProcessTime;
sendToOutputOrNot(String.format(PROCESSING_FORMAT, prevProcessTook));
startOfProcessTime = System.currentTimeMillis();
}
protected void finished(){
long currentTime = System.currentTimeMillis();
long timeTaken = currentTime - startTime;
long prevProcessTook = currentTime - startOfProcessTime;
startOfProcessTime = System.currentTimeMillis();
if(closeStreamsWhenComplete){
try {
inStream.close();
outStream.close();
} catch (IOException e) {
//Nothing done
}
}
sendToOutputOrNot(String.format(SAVING_FORMAT, prevProcessTook, timeTaken));
}
private void sendToOutputOrNot(String toBePrinted){
if(showOutputMessages){
actuallySendToOutput(toBePrinted);
}
}
protected void actuallySendToOutput(String toBePrinted){
System.out.println(toBePrinted);
}
}
DocxToPDFConverter类
public class DocxToPDFConverter extends Converter {
public DocxToPDFConverter(InputStream inStream, OutputStream outStream,
boolean showMessages, boolean closeStreamsWhenComplete) {
super(inStream, outStream, showMessages, closeStreamsWhenComplete);
}
@Override
public void convert() throws Exception {
loading();
XWPFDocument document = new XWPFDocument(inStream);
PdfOptions options = PdfOptions.create();
processing();
PdfConverter.getInstance().convert(document, outStream, options);
finished();
}
}
因为我是maven 所需的夹包
<dependency>
<groupId>args4j</groupId>
<artifactId>args4j</artifactId>
<version>2.32</version>
</dependency>
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.12</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.12</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.12</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>org.apache.poi.xwpf.converter.pdf</artifactId>
<version>1.0.5</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.6</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>org.odftoolkit.odfdom.converter.pdf</artifactId>
<version>1.0.5</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.xdocreport.itext.extension</artifactId>
<version>1.0.5</version>
</dependency>
测试
public static void main(String[] args) {
String outpath = "F:\\AA.doc";
String docxPath = XmlDocToDocxUtil.invoke(outpath);
InputStream source;
OutputStream target;
try {
source = new FileInputStream(docxPath);
target = new FileOutputStream("E:\\aa.pdf");
PdfOptions options = PdfOptions.create();
DocxToPDFConverter converter = new DocxToPDFConverter(source, target, true, true);
converter.convert();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}