Вопрос по java, ms-word, image, html, apache-poi – Мне нужны Apache POI Изображения, преобразованные из текстового документа в HTML-файл

1

У меня есть некоторый код, который использует библиотеку 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(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;

}
Удо Я, к сожалению, нахожусь в точке, где мне нужно использовать Apache POI и продолжить то, что у меня есть. yams
Посмотрите на этот пример, он использует POI WordToHtmlConverter:stackoverflow.com/questions/7868713/... Udo Klimaschewski
Это зависит от ваших потребностей, для эталонного решения потребуется отдельный файл для каждого изображения, а встроенное решение будет содержать все изображения и HTML в одном файле. Для реализации первого, вы бы просто сохранили изображения в файл и сослались на расположение вimg тег. Для второго решения вам нужно сначала преобразовать изображение в строку Base64 и встроить его непосредственно вimg тег. Вы можете выполнить поиск переполнения стека и в Интернете для получения более подробной информации о том, как сделать то и другое. Udo Klimaschewski
То есть вы хотите закодировать изображение непосредственно в HTML-разметку для вашего документа, не делая ссылка? Там's URI данных, который работает в большинстве современных браузеров, например, Увидетьen.wikipedia.org/wiki/Data_URI_scheme. Udo Klimaschewski

Ваш Ответ

3   ответа
0

@ user4887078 Это 'Как и сказал @Guga, я просто посмотрел org..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);
@ user2955641 ты уже пробовал мой? Enrico
хм @ Энрико это 'Ответы уже были получены ... yams
Я тоже попробовал этот подход. Я могу сохранить изображение из документа word в каталоге pages / imgs. Какой подход я должен использовать, чтобы включить его в преобразованный HTML, который генерируется? Я'Я застрял здесь. Любая помощь будет принята с благодарностью. user2955641
0

Использовать это должно быть полезно.

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 (). Следовательно, изображение не преобразуется в HTML из слова документа. Пожалуйста, совет, как это исправить? user2955641
3

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

Если вы посмотрите на этоprocessImage(...) метод в AbstractWordConverter.java в строке 790, похоже, что метод вызывает другой метод с именем.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

а затем переопределите метод и поместите в него любой код.



У меня нетЯ проверил это, но это должно быть правильным путем из того, что я вижу теоретически.

@Guga привет, есть пример кода, чтобы показать мне, как это сделать? user4887078
На самом деле вы неНеобходимо переопределить любой метод в WordToHtmlConverter, указанный ссылками в ответе. Реализация уже охватывает создание ссылок. Вам просто нужно реализовать интерфейс PicturesManager (чтобы сохранить картинки) и установить менеджер картинок конвертера. Guga

Похожие вопросы