Aspose.Words For Java转化含图片的表格时表格溢出

Aspose.Words For Java转化含图片的表格时表格溢出,设置了根据内容自动调整表格似乎不起作用。
这是我的代码:

String filePath = "D:\\test.html";
String content = new String(Files.readAllBytes(Paths.get(filePath)));
Document document = new Document();
DocumentBuilder builder = new DocumentBuilder(document);
builder.insertHtml(content);
for (Object obj : document.getChildNodes(NodeType.TABLE, true))
{
    Table table = (Table)obj;
    table.autoFit(AutoFitBehavior.AUTO_FIT_TO_CONTENTS);
}
document.save("D:\\test.pdf");

对应的html文件与转化后的pdf如下:
test.zip (82.4 KB)

@suhjt 在这种情况下,Aspose.Words 模仿 MS Word 的行为。 如果您在 MS Word 中打开您的 HTML,输出将类似于 Aspose.Words 输出:
ms.pdf (28.7 KB)
aw.pdf (79.7 KB)

有没有API能够设置table的格式,使得生成的文件表格样式达到aw.pdf这种效果呢?

@suhjt aw.pdf 是使用以下简单代码生成的:

Document doc = new Document("C:\\temp\\in.html");
doc.save("C:\\Temp\\out.pdf");

@alexey.noskov 哦,好的,谢谢!
通过这种方法生成的pdf文件,我这边简单验证了一下,确实是会自动调整,不会出现表格溢出的问题。
但是我们需要对传入的html文件进行处理,需要通过DocumentBuilder插入html字符串的方式生成Document;这种情况下,有API能够对表格进行调整吗?

@suhjt 以下代码产生类似的输出:

Document doc = new Document();
doc.getCompatibilityOptions().optimizeFor(MsWordVersion.WORD_2019);
DocumentBuilder builder = new DocumentBuilder(doc);
builder.insertHtml(readFile("C:\\Temp\\in.html", StandardCharsets.UTF_8));
doc.save("C:\\Temp\\aw_insertHtml.pdf");

@alexey.noskov 问题得到了解决,十分感谢!

1 Like

@alexey.noskov 这种情况下,图片有可能会被截取掉一部分是吗?

@suhjt 您能否更详细地说明您的要求? 如果可能,请附上您的输入、输出和预期输出文件。

这是我的代码:

String content = new String(Files.readAllBytes(Paths.get("D:\\test\\test.html")));
Document document = new Document();
document.getCompatibilityOptions().optimizeFor(MsWordVersion.WORD_2019);
DocumentBuilder builder = new DocumentBuilder(document);
builder.insertHtml(content);
document.save("D:\\test\\test.pdf");

输入文件和输出文件如下:test.zip (95.8 KB)

你可以发现html文件里的图片转化为pdf文件后,被截取掉了一部分。我希望转化的时候能够将图片进行等比例的缩放,使得图片能够保持完整。

@suhjt 不幸的是,没有办法自动调整图像大小以适合容器。
您可以使用 LayoutCollectorLayoutEnumerator 类来计算形状的实际边界,然后调整形状的大小。

Document doc = new Document("C:\\Temp\\in.html");
doc.setWarningCallback(new FontSubstitutionWarningCollector());

LayoutCollector collector = new LayoutCollector(doc);
LayoutEnumerator enumerator = new LayoutEnumerator(doc);

Iterable<Shape> shapes = doc.getChildNodes(NodeType.SHAPE, true);
for (Shape s : shapes)
{
    // Make sure we work with top level shape and shape is not in header/footer.
    if (s.isTopLevel() && s.getAncestor(NodeType.HEADER_FOOTER) == null)
    {
        enumerator.setCurrent(collector.getEntity(s));
        Rectangle2D rect = enumerator.getRectangle();
        System.out.println("Page: " + enumerator.getPageIndex() + "\tX=" + rect.getX() + "; Y=" + rect.getY() + "; Width=" + rect.getWidth() + "; Height=" + rect.getHeight());
    }
}

加了这行代码之后,通过updateFields()不会更新页码吗?页码是通过insertField(“PAGE”, “”)写入的。

@alexey.noskov 有计划支持图片根据表格单元格大小进行等比例缩放吗?

@suhjt

不幸的是,我无法在我这边重现该问题。 您能否提供示例代码,以便我们重现该问题? 我们将检查问题并为您提供更多信息。

不,目前的路线图中没有这样的计划。

@alexey.noskov 有API可以获取表格单元格的宽高吗?

@suhjt 您可以使用如下代码获取表格单元格的边界框:

Document doc = new Document("C:\\Temp\\in.docx");
LayoutCollector collector = new LayoutCollector(doc);
LayoutEnumerator enumerator = new LayoutEnumerator(doc);

// Get cells
Iterable<Cell> cells = doc.getChildNodes(NodeType.CELL, true);
for (Cell cell : cells)
{
    // Move enumerator to cell
    enumerator.setCurrent(collector.getEntity(cell.getFirstParagraph()));
    while (enumerator.getType() != LayoutEntityType.CELL)
        enumerator.moveParent();

    // Get bounding box of the cell
    Rectangle2D rect = enumerator.getRectangle();
    System.out.println("Page: " + enumerator.getPageIndex() + "\tX=" + rect.getX() + "; Y=" + rect.getY() + "; Width=" + rect.getWidth() + "; Height=" + rect.getHeight());
}