https://www.toutiao.com/article/7218818409369190964/

https://github.com/VolodymyrBaydalka/docxjs

docxjs

我们都知道pdf有js库可以使pdf文档用浏览器在线阅读,Excel文档也有在线生成的js库,word docx文档在线阅读,以前用过微软提功能的在线阅读web工具。这里推荐一个能自主部署的docx文档在线渲染js库:docxjs。

在线渲染效果

docxjs使用
这个js库使用方法非常简单,直接使用cdn方式引用,注意为了兼容性要引用polyfill哦:


<!--optional polyfill for promise-->
<script src="https://unpkg.com/promise-polyfill/dist/polyfill.min.js"></script>
<!--lib uses jszip-->
<script src="https://unpkg.com/jszip/dist/jszip.min.js"></script>
<script src="docx-preview.min.js"></script>
<script>
    var docData = <document Blob>;

    docx.renderAsync(docData, document.getElementById("container"))
        .then(x => console.log("docx: finished"));
</script>
<body>
    ...
    <div id="container"></div>
    ...
</body>

应用程序接口

renderAsync(
    document: Blob | ArrayBuffer | Uint8Array, // could be any type that supported by JSZip.loadAsync
    bodyContainer: HTMLElement, //element to render document content,
    styleContainer: HTMLElement, //element to render document styles, numbeings, fonts. If null, bodyContainer will be used.
    options: {
        className: string = "docx", //class name/prefix for default and document style classes
        inWrapper: boolean = true, //enables rendering of wrapper around document content
        ignoreWidth: boolean = false, //disables rendering width of page
        ignoreHeight: boolean = false, //disables rendering height of page
        ignoreFonts: boolean = false, //disables fonts rendering
        breakPages: boolean = true, //enables page breaking on page breaks
        ignoreLastRenderedPageBreak: boolean = true, //disables page breaking on lastRenderedPageBreak elements
        experimental: boolean = false, //enables experimental features (tab stops calculation)
        trimXmlDeclaration: boolean = true, //if true, xml declaration will be removed from xml documents before parsing
        useBase64URL: boolean = false, //if true, images, fonts, etc. will be converted to base 64 URL, otherwise URL.createObjectURL is used
        useMathMLPolyfill: boolean = false, //includes MathML polyfills for chrome, edge, etc.
        showChanges: false, //enables experimental rendering of document changes (inserions/deletions)
        debug: boolean = false, //enables additional logging
    }
    ): Promise<any>

缩略图、目录相关
例如,仅添加缩略图,它不是库的一部分。库将 DOCX 渲染为 HTML,因此无法有效地将其用于缩略图。

目录是使用 TOC 字段构建的,此时没有有效的方法来获取目录,因为尚不支持字段

注意事项
当前库确实会中断页面:

如果插入了用户/手动分页符 - 当用户插入分页符时<w:br w:type=”page”/>
如果插入了应用程序分页符 - 可以通过编辑器应用程序(如MS Word)插入(应设置为false)<w:lastRenderedPageBreak/>ignoreLastRenderedPageBreak
如果段落的页面设置已更改 - 例如:用户将设置从纵向页面更改为横向页面
未实现实时分页符,因为它需要重新计算每次插入的大小,这可能会对性能产生很大影响。

如果分页对您来说很困难,我建议您:


尝试尽可能多地插入手动断点
尝试使用像MS Word这样的编辑器,插入断点<w:lastRenderedPageBreak/>
注:缺省设置为 。您可能需要将其设置为 ,以使库按断点中断
ignoreLastRenderedPageBreaktruetrue<w:lastRenderedPageBreak/>

状态和稳定性
到目前为止,我无法提出解析文档的最终方法和 API 的最终结构。只有 renderAsync 函数是稳定的,将来不应更改定义。解析和呈现的内部实现可以随时更改。

在线体验演示地址:

https://volodymyrbaydalka.github.io/docxjs/

文档更新时间: 2023-07-06 13:52   作者:admin