spire操作word

319 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情

spire操作word

前言

之前我们介绍过poi-tl生成word文档的功能, 但是这个工具暂不支持操作目录, 所以我们使用spire这个小工具更新目录, 注意这个工具免费版的有使用限制, 但是发现更新后的目录间距不一致, 有点不好看, spire还支持转很多格式的文件

maven

<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.doc.free</artifactId>
    <version>3.9.0</version>
</dependency>

代码

将目录间距设置为一致大小 只需要将更新完目录的文档重新设置一下间距就行了

private static void setTOCParagraphLineSpacing(Document document, float size) {
    for (Object obj1 : document.getSections()) {
        Section section = (Section) obj1;
        for (Object obj2 : section.getBody().getChildObjects()) {
            if (obj2 instanceof StructureDocumentTag) {
                StructureDocumentTag std = (StructureDocumentTag) obj2;
                for (Object obj3 : std.getChildObjects()) {
                    if (obj3 instanceof Paragraph) {
                        Paragraph paragraph = (Paragraph) obj3;
                        if (paragraph.getStyle().getName().contains("TOC")) {
                            // 找到目录项里的所有段落 设置他们的间距为同一个值
                            paragraph.getFormat().setLineSpacingRule(LineSpacingRule.Exactly);
                            paragraph.getFormat().setLineSpacing(size);
                        }
                    }
                }
            }
        }
    }
}

效果

image.png 可以看到目录间距都被设置成一致的了

转pdf

我们这里尝试一下word转pdf

Document document = new Document(source);
String path = "/tmp/test.pdf";
File file = new File(path);
try {
    // 这里设置FileFormat.Auto(根据文件后缀自动格式化), 也可以指定为FileFormat.PDF
    document.saveToFile(path, FileFormat.Auto);
} finally {
    document.close();
}

可以看到使用非常简单, 注意在服务器上可能存在缺少字体导致转pdf产生乱码的情况, 我们需要将使用到的字体安装到服务器上, 如果不确定使用到了那些字体, 可以将windows中的C:\Windows\Fonts文件夹下的字体全部打包上传到服务器

服务器使用

mkdir /usr/share/fonts/win
# 这里的fonts就是windows上的字体
cp fonts /usr/share/fonts/win
chmod 755 /usr/share/fonts/win
fc-cache

docker使用

RUN mkdir /usr/share/fonts/win
# 这里的fonts就是windows上的字体, 放到Dockerfile同级目录
COPY fonts /usr/share/fonts/win
RUN chmod 755 /usr/share/fonts/win  \
    && fc-cache -fv  && fc-list