suhjt
May 8, 2023, 8:27am
1
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)
suhjt
May 8, 2023, 8:45am
3
有没有API能够设置table的格式,使得生成的文件表格样式达到aw.pdf这种效果呢?
@suhjt aw.pdf
是使用以下简单代码生成的:
Document doc = new Document("C:\\temp\\in.html");
doc.save("C:\\Temp\\out.pdf");
suhjt
May 8, 2023, 8:52am
6
@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");
suhjt
May 9, 2023, 9:50am
8
@alexey.noskov 问题得到了解决,十分感谢!
1 Like
suhjt
May 10, 2023, 3:56am
9
@alexey.noskov 这种情况下,图片有可能会被截取掉一部分是吗?
@suhjt 您能否更详细地说明您的要求? 如果可能,请附上您的输入、输出和预期输出文件。
suhjt
May 10, 2023, 7:58am
11
这是我的代码:
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 不幸的是,没有办法自动调整图像大小以适合容器。
您可以使用 LayoutCollector 和 LayoutEnumerator 类来计算形状的实际边界,然后调整形状的大小。
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());
}
}
suhjt
May 16, 2023, 8:00am
14
加了这行代码之后,通过updateFields()不会更新页码吗?页码是通过insertField(“PAGE”, “”)写入的。
suhjt
May 16, 2023, 9:27am
15
@alexey.noskov 有计划支持图片根据表格单元格大小进行等比例缩放吗?
@suhjt
不幸的是,我无法在我这边重现该问题。 您能否提供示例代码,以便我们重现该问题? 我们将检查问题并为您提供更多信息。
不,目前的路线图中没有这样的计划。
suhjt
May 30, 2023, 2:37am
17
@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());
}