docx4j-ImportXHTML: проблемы с выравниванием таблицы и шириной изображения - PullRequest
0 голосов
/ 04 октября 2019

Я использую библиотеку docx4j для преобразования html-файла в документ docx в формате A4 - портрет. HTML-код содержит следующие элементы:

  • тег img, стилизованный с использованием "width", установленной в "100%"
  • тег таблицы, в котором атрибут "align" установлен в "center"«

в выходном документе я вижу следующие проблемы:

  • изображение масштабируется и превышает ширину документа. некоторая часть изображения не видна
  • таблица не выровнена по центру, но находится далеко от центра с правой стороны

даже при использовании книжной ориентации (docx4j.properties), похоже, что расчеты производятся с использованием альбомной ориентации. из простых примеров, которые я видел, все должно работать как положено, но это не так.

Я также пробовал следующее:

  • изменил DPI из файла свойств
  • создал пользовательский DocxRenderer и установил пользовательские dotsPerPoint и dotsPerPixel (не смог найти правильные значения)
  • бродил с отладкой в ​​библиотеках docx4j, пытаясь найти решение (чего-то, чего я не выяснилout)
  • попросил найти решение на официальном форуме docx4j и github (существующее сообщение / проблема)
  • много поисков в течение 4 дней (google, docx4java, stackoverflow и т. д.)

похоже, эта проблема встречается редко. что-то я не так делаю?

спасибо!

ниже приведен скриншот с сгенерированным файлом и исходным кодом (свойства Java, docx4j и HTML)

enter image description here

package app.docx;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

import org.docx4j.convert.in.xhtml.XHTMLImporterImpl;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;

public class Entrypoint {
    public static void main(String[] args) throws Exception {
        // read html content from file
        String bodyXHTML = new String(Files.readAllBytes(Paths.get("path-to-file.html")));
        bodyXHTML = bodyXHTML.replaceAll("\\r|\\n|\\t", "");

        WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
        XHTMLImporterImpl XHTMLImporter = new XHTMLImporterImpl(wordMLPackage);

        List<Object> items = XHTMLImporter.convert(bodyXHTML, "");

        XHTMLImporter.setHyperlinkStyle("Hyperlink");
        wordMLPackage.getMainDocumentPart().getContent().addAll(items);

        // save docx to file
        String dir = System.getProperty("user.dir");
        File outputFile = new File (dir, "output.docx");
        wordMLPackage.save(outputFile);
    }
}
# docx setup

# XHTMLImporter needs to know how to convert pixel measurements
# This is read by UnitsOfMeasurement
docx4j.DPI=96

# Page size: use a value from org.docx4j.model.structure.PageSizePaper enum
# eg A4, LETTER
docx4j.PageSize=A4
# Page size: use a value from org.docx4j.model.structure.MarginsWellKnown enum
docx4j.PageMargins=NORMAL
docx4j.PageOrientationLandscape=false

# ..
<html xmlns="http://www.w3.org/1999/xhtml">
    <body>
        <img src="https://www.catster.com/wp-content/uploads/2015/06/cat-breeds-maine-coon-42779359.jpg" width="100%" />
        <table align="center">
            <tr>
                <td>Name:</td>
                <td>Jackson</td>
            </tr>
        </table>
    </body>
</html>
...