【问题标题】:Convert DOCX to HTML incliding IMAGES将 DOCX 转换为 HTML,包括图像
【发布时间】:2014-05-25 04:25:07
【问题描述】:

我正在使用 DOCX4J 将 DOCX 转换为 HTML。我已成功完成转换并获得了 html 格式。我将使用 html 格式将其嵌入为 EMAIL 正文以发送电子邮件。但我有一些问题列在下面....

  1. 无法在电子邮件正文中显示图像
  2. 丢失空格和项目符号

请找出我写的代码,

WordprocessingMLPackage wordMLPackage;
wordMLPackage = Docx4J.load(new java.io.File(resourcePath2));
HTMLSettings htmlSettings = Docx4J.createHTMLSettings();
htmlSettings.setImageDirPath(imageFolder + resourcePath2 + "_files"); 
htmlSettings.setImageTargetUri(imageFolder +resourcePath2.substring(resourcePath2.lastIndexOf("/")+1) + "_files");
htmlSettings.setWmlPackage(wordMLPackage);

OutputStream os; 
os = new ByteArrayOutputStream();
Docx4jProperties.setProperty("docx4j.Convert.Out.HTML.OutputMethodXML", true);
Docx4J.toHTML(htmlSettings, os, Docx4J.FLAG_SAVE_FLAT_XML);
DOCX = ((ByteArrayOutputStream)os).toString();

【问题讨论】:

  • 为什么不将 docx 附加到电子邮件中?
  • 我们的用户不希望它作为附件,他们需要电子邮件正文中的整个 DOCX。
  • 空格和项目符号可能需要成为单独的问题,OpenXML 的示例未按您的预期处理。

标签: java html docx docx4j


【解决方案1】:

您可以在代码中添加这样的内容

package tcg.doc.web.managedBeans;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.poi.xwpf.converter.core.FileImageExtractor;
import org.apache.poi.xwpf.converter.core.FileURIResolver;
import org.apache.poi.xwpf.converter.xhtml.XHTMLConverter;
import org.apache.poi.xwpf.converter.xhtml.XHTMLOptions;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope("session")
@Qualifier("ConvertWord")


public class ConvertWord {
    private static final String docName = "TestDocx.docx";
    private static final String outputlFolderPath = "d:/";


    String htmlNamePath = "docHtml.html";
    String zipName="_tmp.zip";
    File docFile = new File(outputlFolderPath+docName);
    File zipFile = new File(zipName);




      public void ConvertWordToHtml() {

          try {

                // 1) Load DOCX into XWPFDocument
                InputStream doc = new FileInputStream(new File(outputlFolderPath+docName));
                System.out.println("InputStream"+doc);
                XWPFDocument document = new XWPFDocument(doc);

                // 2) Prepare XHTML options (here we set the IURIResolver to load images from a "word/media" folder)
                XHTMLOptions options = XHTMLOptions.create(); //.URIResolver(new FileURIResolver(new File("word/media")));;

                // Extract image
                String root = "target";
                File imageFolder = new File( root + "/images/" + doc );
                options.setExtractor( new FileImageExtractor( imageFolder ) );
                // URI resolver
                options.URIResolver( new FileURIResolver( imageFolder ) );


                OutputStream out = new FileOutputStream(new File(htmlPath()));
                XHTMLConverter.getInstance().convert(document, out, options);


                System.out.println("OutputStream "+out.toString());
            } catch (FileNotFoundException ex) {

            } catch (IOException ex) {

            } 
         }

      public static void main(String[] args) {
         ConvertWord cwoWord=new ConvertWord();
         cwoWord.ConvertWordToHtml();
         System.out.println();
    }



      public String htmlPath(){
        // d:/docHtml.html
          return outputlFolderPath+htmlNamePath;
      }

      public String zipPath(){
          // d:/_tmp.zip
          return outputlFolderPath+zipName;
      }

}

对于maven对pom.xml的依赖

<dependency>
  <groupId>fr.opensagres.xdocreport</groupId>
  <artifactId>org.apache.poi.xwpf.converter.xhtml</artifactId>
  <version>1.0.4</version>
</dependency>

或从Here下载

【讨论】:

  • apache组的官方xwpf-converter在哪里?
【解决方案2】:

为了使图像在电子邮件正文中起作用,我想您需要使用数据 URI 或将它们发布到网络可访问的位置。

无论哪种情况,您都需要编写以下实现:

public interface ConversionImageHandler {

/**
 * @param picture 
 * @param relationship of the image 
 * @param part of the image, if it is an internal image, otherwise null
 * @return uri for the image we've saved, or null
 * @throws Docx4JException this exception will be logged, but not propagated
 */
public String handleImage(AbstractWordXmlPicture picture, Relationship relationship, BinaryPart part) throws Docx4JException;
}

并配置 docx4j 以将其与 htmlSettings.setImageHandler 一起使用。

您可以查看 docx4j 源代码中的一些现有实现,并利用 AbstractConversionImageHandler 中的辅助方法(例如,如果您需要数据 URI,则为 createEncodedImage)。

【讨论】:

    猜你喜欢
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    相关资源
    最近更新 更多