freemarker 生成的wrod 在转pdf 就会是xml

最近因为要用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();
    }

}

猜你喜欢

转载自blog.csdn.net/qq_39608433/article/details/89336489
今日推荐