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();
    }

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
通过使用Freemarker,可以将XML文件换为PDF。首先,我们需要将Word模板另存为XML格式,并将文件后缀名改为.ftl。然后,在.ftl文件中,使用占位符将相关变量填充进去。接下来,通过赋值给这些变量,可以使用Freemarker将这些值填充到对应的位置上。最后,将此XML文件换为流,并使用Aspose将流换为PDF文件即可。 需要注意的是,对于不包含宏、函数等的Word或Excel文件,也可以使用Freemarker以模板的方式动态生成这些文件。对于Word文件,可以将其另存为XML格式,然后使用Freemarker进行动态编辑;对于Excel文件,暂时不支持直接使用模板动态生成xlsx文件。 具体操作步骤如下: 1. 将Word文档另存为XML文档,并使用文本编辑器(如Notepad)打开XML文件。 2. 将需要修改的内容改为变量,并保存此文档。 3. 将XML文档的后缀名改为.ftl,即将其换为Freemarker模板文档。 4. 添加Freemarker依赖并进行配置。 5. 将.ftl模板文件换为流。 6. 使用Aspose将流换为PDF文件。 通过以上步骤,我们可以成功地将XML文件换为PDF文件,实现Freemarker XMLPDF的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [利用aspose把freemarker模板换为PDF](https://blog.csdn.net/weixin_44117635/article/details/122605083)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [JAVA项目代码绘制PDF和通过freemarker动态生成PDF](https://download.csdn.net/download/hhao0503/87824768)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值