Apache POI - преобразование * .doc в * .html с изображениями

Есть файл DOC, содержащий какое-то изображение. Как преобразовать его в HTML с изображением?

Я попытался использовать этот пример: Преобразовать документ Word в HTML программно на Java < / а>

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 с изображениями?


person Community    schedule 11.12.2012    source источник


Ответы (2)


Лучше всего в этом случае использовать Apache Tika и позволить ему обернуть для вас Apache POI. Apache Tika сгенерирует HTML для вашего документа (или обычный текст, но вам нужен HTML для вашего случая). Наряду с этим он поместит заполнители для встроенных ресурсов, теги img для встроенных изображений и предоставит вам способ получить доступ к содержимому встроенных ресурсов и изображений.

В Alfresco есть очень хороший пример, HTMLRenderingEngine. Скорее всего, вы захотите просмотреть код там, а затем написать свой собственный, чтобы сделать что-то очень похожее. Код там включает настраиваемый ContentHandler, который позволяет редактировать теги img, перезаписывать атрибуты src, это может вам понадобиться или не понадобится в зависимости от того, куда вы собираетесь записывать изображения.

person Gagravarr    schedule 11.12.2012
comment
@ Алексей, не могли бы вы подробнее рассказать, как вы решили эту проблему, какие-нибудь полезные ссылки? - person Jalal Sordo; 13.12.2013

Расширьте 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);
person raok1997    schedule 24.03.2015
comment
Это поддерживает включение изображения только в качестве встроенного содержимого base64. Для создания ссылок нужен другой подход. - person raok1997; 24.03.2015
comment
спасибо, все работает хорошо. это должен быть принятый ответ. - person Sathia; 31.12.2020