【问题标题】:I need Apache POI Pictures converted from a word document to a html file我需要将 Apache POI 图片从 word 文档转换为 html 文件
【发布时间】:2012-10-30 13:58:53
【问题描述】:

我有一些代码使用 Java Apache POI 库打开 Microsoft Word 文档并将其转换为 html,使用 Apache POI,它还获取文档上图像的字节数组数据。但我需要将此信息转换为 html 以写入 html 文件。任何提示或建议将不胜感激。请记住,我是一名桌面开发人员,而不是一名网络程序员,所以当你提出建议时,请记住这一点。下面的代码获取图像。

 private void parseWordText(File file) throws IOException {
      FileInputStream fs = new FileInputStream(file);
      doc = new HWPFDocument(fs);
      PicturesTable picTable = doc.getPicturesTable();
      if (picTable != null){
           picList = new ArrayList<Picture>(picTable.getAllPictures());
           if (!picList.isEmpty()) {
           for (Picture pic : picList) {
                byte[] byteArray = pic.getContent();
                pic.suggestFileExtension();
                pic.suggestFullFileName();
                pic.suggestPictureType();
                pic.getStartOffset();
           }
        }
     }

然后下面的代码将文档转换为 html。有没有办法在下面的代码中将 byteArray 添加到 ByteArrayOutputStream 中?

private void convertWordDoctoHTML(File file) throws ParserConfigurationException, TransformerConfigurationException, TransformerException, IOException {
    HWPFDocumentCore wordDocument = null;
    try {
        wordDocument = WordToHtmlUtils.loadDoc(new FileInputStream(file));
    } catch (IOException ex) {
        Exceptions.printStackTrace(ex);
    }

    WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());
    wordToHtmlConverter.processDocument(wordDocument);
    org.w3c.dom.Document htmlDocument = wordToHtmlConverter.getDocument();
    NamedNodeMap node = htmlDocument.getAttributes();


    ByteArrayOutputStream out = new ByteArrayOutputStream();
    DOMSource domSource = new DOMSource(htmlDocument);
    StreamResult streamResult = new StreamResult(out);

    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer serializer = tf.newTransformer();
    serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
    serializer.setOutputProperty(OutputKeys.INDENT, "yes");
    serializer.setOutputProperty(OutputKeys.METHOD, "html");
    serializer.transform(domSource, streamResult);
    out.close();

    String result = new String(out.toByteArray());
    acDocTextArea.setText(newDocText);

    htmlText = result;

}

【问题讨论】:

  • 看看这个例子,它使用 POI WordToHtmlConverter: stackoverflow.com/questions/7868713/…
  • 我已经让那部分代码工作了,我正在询问如何将图片放入 html 中。你知道我在上面创建的图片列表。
  • 所以您的意思是,您想将图片直接编码到您的文档的 HTML 标记中,而不做 &lt;img src="http://..."/&gt; 引用?有一个适用于大多数现代浏览器的数据 URI,例如&lt;img src="data:image/png;base64,..."/&gt;。见en.wikipedia.org/wiki/Data_URI_scheme
  • 所以,Udo,我不是网络开发人员,我该怎么办?哪个更容易实现?
  • 您是否考虑过使用 Apache Tika?这已经提供了一种封装 Apache POI 并输出 HTML 版本以及任何嵌入式资源(例如图像)的方法,因此您可以避免重新发明轮子!

标签: java html image ms-word apache-poi


【解决方案1】:

查看org.apache.poi.hwpf.converter.WordToHtmlConverter 的源代码

http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/converter/WordToHtmlConverter.java?view=markup&pathrev=1180740

它在 JavaDoc 中声明:

此实现不会创建图像或指向它们的链接。这可以是 通过覆盖 {@link #processImage(Element, boolean, Picture)} 方法进行更改

如果您查看 AbstractWordConverter.java 中第 790 行的 processImage(...) 方法,看起来该方法正在调用另一个名为 processImageWithoutPicturesManager(...) 的方法。

http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/converter/AbstractWordConverter.java?view=markup&pathrev=1180740

此方法再次在WordToHtmlConverter 中定义,看起来与您想要扩展代码的地方完全一样(第 317 行):

@Override
protected void processImageWithoutPicturesManager(Element currentBlock,
    boolean inlined, Picture picture)
{
    // no default implementation -- skip
    currentBlock.appendChild(htmlDocumentFacade.document
    .createComment("Image link to '"
    + picture.suggestFullFileName() + "' can be here"));
}

我认为您已经知道从哪里开始将图像插入到流程中。

创建转换器的子类,例如

    public class InlineImageWordToHtmlConverter extends WordToHtmlConverter

然后重写该方法并将任何代码放入其中。

我没有测试过,但从理论上我所看到的应该是正确的方法。

【讨论】:

  • 实际上,您不需要覆盖答案中链接指向的 WordToHtmlConverter 中的任何方法。该实现已经涵盖了链接创建。您只需要实现PictureManager接口(保存图片)并设置转换器的图片管理器。
  • @Guga 嗨,有代码示例告诉我怎么做吗?
【解决方案2】:

@user4887078 正如@Guga 所说,这很简单,我所做的只是查看 org.apache.poi.xwpf.converter.core.FileImageExtractor 和 瞧! 它确实可以按预期工作,尽管它可能仍需要一些重构和优化。

HWPFDocumentCore wordDocument = WordToHtmlUtils.loadDoc(is);

            WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(
                    DocumentBuilderFactory.newInstance().newDocumentBuilder()
                            .newDocument());
            wordToHtmlConverter.setPicturesManager(new PicturesManager() {
                @Override
                public String savePicture(byte[] bytes, PictureType pictureType, String s, float v, float v1) {
                    File imageFile = new File("pages/imgs", s);
                    imageFile.getParentFile().mkdirs();
                    InputStream in = null;
                    FileOutputStream out = null;

                    try {
                        in = new ByteArrayInputStream(bytes);
                        out = new FileOutputStream(imageFile);
                        IOUtils.copy(in, out);

                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                        if (in != null) {
                            IOUtils.closeQuietly(in);
                        }

                        if (out != null) {
                            IOUtils.closeQuietly(out);
                        }

                    }
                    return "imgs/" + imageFile.getName();
                }
            });
            wordToHtmlConverter.processDocument(wordDocument);
            Document htmlDocument = wordToHtmlConverter.getDocument();
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            DOMSource domSource = new DOMSource(htmlDocument);
            StreamResult streamResult = new StreamResult(out);


            Transformer transformer = TransformerFactory.newInstance().newTransformer();
            transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.setOutputProperty(OutputKeys.METHOD, "html");
            transformer.transform(domSource, streamResult);
            out.close();

            String result = new String(out.toByteArray());
            FileOutputStream fos = new FileOutputStream(outFile);

【讨论】:

  • 我也尝试过这种方法。我可以将 word 文档中的图像保存在 pages/imgs 目录中。我应该遵循什么方法将其包含在生成的转换后的 html 中?我被困在这里。任何帮助将不胜感激。
  • @NitinAvula 我希望你已经解决了这个问题,因为我现在才看到你的 cmets...我已经有一段时间查找 Java 但是我很高兴分享我的小型多文档查看器我当时就用这个来构建......或者更好地提供一个小提琴或要点,这样我就可以确定如何更好地提供帮助。
  • 感谢您的回复。这是我旧项目中的一个问题。我不记得我是否解决了它或找到了解决方法。不过感谢您的帮助:)
  • 好吧,那换个时间吧。干杯!
【解决方案3】:

使用这个应该很有用。

public class InlineImageWordToHtmlConverter extends WordToHtmlConverter{
    public InlineImageWordToHtmlConverter(Document document) {
        super(document);
    } 

    @Override
    protected void processImageWithoutPicturesManager(Element currentBlock, boolean inlined, Picture picture) {
        Element img = super.getDocument().createElement("img");
        img.setAttribute("src", "data:image/png;base64,"+Base64.getEncoder().encodeToString(picture.getContent()));
        currentBlock.appendChild(img);
    }
}

【讨论】:

  • 我试过了。我扩展了 WordToHtmlConverter 并覆盖了 processImageWithoutPicturesManager() 方法。但是我在调​​试期间发现的问题是 InlineImageWordToHtmlConverter() 的构造函数被调用,而不是被覆盖的 processImageWithoutPicturesManager() 方法。因此,图像不会从 word 文档转换为 html。请建议如何解决这个问题?
猜你喜欢
  • 1970-01-01
  • 2023-03-14
  • 2011-01-16
  • 1970-01-01
  • 2016-10-29
  • 2011-09-06
  • 2016-10-21
  • 2013-08-24
  • 1970-01-01
相关资源
最近更新 更多