Html转换word 1.gif图片和大图片被截断。2.表格不显示边框

版本:23.8
编程语言:java

使用的代码:

public static void convert2Word(InputStream in, OutputStream out) throws Exception {
		Document doc = new Document(in);
		try {
			NodeCollection childNodes = doc.getChildNodes(NodeType.PARAGRAPH, true);
			if (childNodes != null) {
				for (Paragraph para : (Iterable<Paragraph>) childNodes) {
					if (para.getListFormat().isListItem()) {
						ListLevel listLevel = para.getListFormat().getListLevel();
						listLevel.getFont().setColor(Color.BLACK);
						if (para.getParagraphFormat().getStyleIdentifier() == StyleIdentifier.HEADING_2) {
							listLevel.setNumberStyle(NumberStyle.ARABIC);
							listLevel.setNumberFormat("\u0001.\u0001、");
						}
						if (para.getParagraphFormat().getStyleIdentifier() == StyleIdentifier.HEADING_3) {
							listLevel.setNumberStyle(NumberStyle.ARABIC);
							listLevel.setNumberFormat("\u0001.\u0001.\u0002、");
						}
						if (para.getParagraphFormat().getStyleIdentifier() == StyleIdentifier.HEADING_4) {
							listLevel.setNumberStyle(NumberStyle.ARABIC);
							listLevel.setNumberFormat("\u0001.\u0001.\u0002.\u0003、");
							listLevel.getFont().setSize(10.5);
							listLevel.getFont().setBold(true);
							listLevel.getFont().getShading().clearFormatting();
						}
					}
				}
			}
		} catch (Exception e) {
			logger.warn("html转换word,处理样式异常", e);
		}
		doc.updateListLabels();
		doc.save(out, SaveFormat.DOCX);
	}

html源文件:
边框.zip (6.0 KB)

转换后的docx文件:
边框-convert.zip (1.1 MB)

问题1截图:
image.png (150.8 KB)

问题2截图:
image.png (7.1 KB)

@ZhonghaoSun 您有转换为 HTML 之前的原始 docx 文件吗?我认为可以使用嵌入的 css 样式来修复表格样式。

@ZhonghaoSun 如果没有,可以使用

PageSetup pageSetup = doc.getFirstSection().getPageSetup();
double width = pageSetup.getPageWidth() - pageSetup.getRightMargin() - pageSetup.getLeftMargin();
for (Shape shape : (Iterable<Shape>) doc.getChildNodes(NodeType.SHAPE, true)) {
    if (shape.getWidth() > width) {
        shape.setWrapType(WrapType.INLINE);
        shape.setWidth(width);
        shape.getImageData().fitImageToShape();
    }
}

Table table = (Table) doc.getChild(NodeType.TABLE, 0,true);
table.setBorders(LineStyle.SINGLE, 1, Color.BLACK);

原始docx文件可以参考这个
表格-原始word文件.zip (243.2 KB)

好的,这个是修复表格边框问题嘛。图片截断能否兼容呢

你好,Aspose-words 23.8版本好像没有示例中的方法:
image.png (31.4 KB)
缺少以下方法
shape.getImageData().fitImageToShape();

@ZhonghaoSun 对不起,您可以删除此方法。更改宽度后我们就不需要它了。
谢谢你提供的文件,我会检查的。

@ZhonghaoSun 这段代码解决了表格的问题。也许使用 saveOptions.setScaleImageToShapeSize(true); 可以解决形状的问题。

Document doc = new Document("input.docx");

HtmlSaveOptions saveOptions = new HtmlSaveOptions();
saveOptions.setExportImagesAsBase64(true);
saveOptions.setScaleImageToShapeSize(false);
saveOptions.setCssStyleSheetType(CssStyleSheetType.EMBEDDED);

doc.save("output.html", saveOptions);
doc = new Document("output.html");

for (Paragraph para : (Iterable<Paragraph>) doc.getChildNodes(NodeType.PARAGRAPH, true)) {
    if (para.getListFormat().isListItem()) {
        ListLevel listLevel = para.getListFormat().getListLevel();
        if (para.getParagraphFormat().getStyleIdentifier() == StyleIdentifier.HEADING_2) {
            listLevel.setNumberStyle(NumberStyle.ARABIC);
            listLevel.setNumberFormat("\u0001.\u0001、");
        }
        if (para.getParagraphFormat().getStyleIdentifier() == StyleIdentifier.HEADING_3) {
            listLevel.setNumberStyle(NumberStyle.ARABIC);
            listLevel.setNumberFormat("\u0001.\u0001.\u0002、");
        }
        if (para.getParagraphFormat().getStyleIdentifier() == StyleIdentifier.HEADING_4) {
            listLevel.setTrailingCharacter(ListTrailingCharacter.NOTHING);
        }
    }
}
doc.updateListLabels();

PageSetup pageSetup = doc.getFirstSection().getPageSetup();
double width = pageSetup.getPageWidth() - pageSetup.getRightMargin() - pageSetup.getLeftMargin();
for (Shape shape : (Iterable<Shape>) doc.getChildNodes(NodeType.SHAPE, true)) {
    if (shape.getWidth() > width) {
        shape.setWrapType(WrapType.INLINE);
        shape.setWidth(width);
    }
}

doc.save("output.docx");