Apache POI - 将 *.doc 转换为带有图片的 *.html

4
有一个包含图片的DOC文件,如何将它转换为带有图片的HTML?
我尝试使用以下示例: 在Java中以编程方式将Word文档转换为HTML
public class Converter {
    ...

    private File docFile, htmlFile;

    try {
        FileInputStream fos = new FileInputStream(docFile.getAbsolutePath()); 
        HWPFDocument doc = new HWPFDocument(fos);       
        Document newDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();

        WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(newDoc) ;
        wordToHtmlConverter.processDocument(doc);

        StringWriter stringWriter = new StringWriter();

        Transformer transformer = TransformerFactory.newInstance().newTransformer();        
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
        transformer.setOutputProperty(OutputKeys.METHOD, "html");
        transformer.transform(
                    new DOMSource(wordToHtmlConverter.getDocument()),
                    new StreamResult(stringWriter)
        );

        String html = stringWriter.toString();

        try {
            BufferedWriter out = new BufferedWriter(
                new OutputStreamWriter(new FileOutputStream(htmlFile), "UTF-8")
            );     
            out.write(html);
            out.close();
       } catch (IOException e) {
           e.printStackTrace();
       }

       JEditorPane jEditorPane = new JEditorPane();
       jEditorPane.setContentType("text/html");
       jEditorPane.setEditable(false);
       jEditorPane.setPage(htmlFile.toURI().toURL());

       JScrollPane jScrollPane = new JScrollPane(jEditorPane);

       JFrame jFrame = new JFrame("display html file");
       jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       jFrame.getContentPane().add(jScrollPane);
       jFrame.setSize(512, 342);
       jFrame.setVisible(true);

    } catch(Exception e) {
        e.printStackTrace();
    }
    ...
}

但是图片丢失了。
WordToHtmlConverter类的文档中指出:

...此实现不会创建图像或链接到它们。 可以通过覆盖 AbstractWordConverter.processImage(Element, boolean, Picture) 方法来更改此行为。

如何将DOC转换为带有图像的HTML?
2个回答

5

扩展WordToHtmlConverter并覆盖processImageWithoutPicturesManager方法。

 import java.util.Base64;

import org.apache.poi.hwpf.converter.WordToHtmlConverter;
import org.apache.poi.hwpf.usermodel.Picture;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class InlineImageWordToHtmlConverter extends WordToHtmlConverter {

    public InlineImageWordToHtmlConverter(Document document) {
        super(document);
    }

    @Override
    protected void processImageWithoutPicturesManager(Element currentBlock,
        boolean inlined, Picture picture)
    {
        Element imgNode = currentBlock.getOwnerDocument().createElement("img");
        StringBuilder sb = new StringBuilder();
        sb.append(Base64.getMimeEncoder().encodeToString(picture.getRawContent()));
        sb.insert(0, "data:"+picture.getMimeType()+";base64,");
        imgNode.setAttribute("src", sb.toString());
        currentBlock.appendChild(imgNode);
    }

}

请使用下面所示的新类来解析文档。
HWPFDocumentCore wordDocument = WordToHtmlUtils.loadDoc(new FileInputStream("D:/temp/Temp.doc"));    
        WordToHtmlConverter wordToHtmlConverter = new InlineImageWordToHtmlConverter(
                DocumentBuilderFactory.newInstance().newDocumentBuilder()
                        .newDocument());
        wordToHtmlConverter.processDocument(wordDocument);

这个支持将图片作为内联base64内容包含。要创建链接,需要采用不同的方法。 - raok1997
1
谢谢,它运行良好。这应该是一个被接受的答案。 - Sathiamoorthy

2
在这种情况下,您最好使用Apache Tika,并让它为您包装Apache POI。 Apache Tika将为您的文档生成HTML(或纯文本,但您需要HTML)。除此之外,它还会放置嵌入式资源的占位符,嵌入式图像的img标记,并为您提供访问嵌入式资源和图像内容的方法。
在Alfresco中有一个非常好的示例,HTMLRenderingEngine。您可能需要查看那里的代码,然后编写自己的代码以执行非常类似的操作。那里的代码包括一个自定义ContentHandler,允许编辑img标记,重新编写src属性,根据您将图像写出到何处,您可能需要或不需要这个功能。

@Alexey,请您提供一些关于您是如何解决这个问题的细节和有用的链接吗? - Jalal Sordo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接