Я использую библиотеку 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](https://i.stack.imgur.com/pw9h1.png)
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>