CN113011129A - 一种通用doc和docx及indd文档排版引擎及方法 - Google Patents
一种通用doc和docx及indd文档排版引擎及方法 Download PDFInfo
- Publication number
- CN113011129A CN113011129A CN202110418589.7A CN202110418589A CN113011129A CN 113011129 A CN113011129 A CN 113011129A CN 202110418589 A CN202110418589 A CN 202110418589A CN 113011129 A CN113011129 A CN 113011129A
- Authority
- CN
- China
- Prior art keywords
- document
- content
- page
- typesetter
- line
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/10—Text processing
- G06F40/103—Formatting, i.e. changing of presentation of documents
- G06F40/106—Display of layout of documents; Previewing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/10—Text processing
- G06F40/12—Use of codes for handling textual entities
- G06F40/151—Transformation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/10—Text processing
- G06F40/166—Editing, e.g. inserting or deleting
- G06F40/177—Editing, e.g. inserting or deleting of tables; using ruled lines
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/10—Text processing
- G06F40/166—Editing, e.g. inserting or deleting
- G06F40/186—Templates
Abstract
本发明提供一种通用DOC和DOCX及INDD文档排版引擎及方法,对主流办公文档DOC和DOCX及书籍出版、杂志编排文档INDD进行排版计算,通过流式文档解析器将DOC、DOCX或INDD解析成统一的流式文档内存模型;对流式文档内存模型进行预处理,载入引用文档,计算并插入段落的数字编号;对预处理后的流式文档内存模型进行CSS格式确定、单词识别及字符和单词宽高等计算;对输入流式文档内存模型进行逐页逐段逐字计算,并将计算结果存入版式内存文档;对排版计算的结果进行后续处理,确定文档中的页码引用、总页数、表列计算;将版式内存文档转换为外存文件格式,实现排版结果的持久保存。
Description
技术领域
本发明涉及一种文档排版方法,尤其是涉及一种通用DOC和DOCX及INDD文档排版引擎及方法。
背景技术
DOC和DOCX是一种流式文档,是目前应用最广泛流式文档格式,也是日常工作中主要的第一手文件格式;INDD文档是国际上报纸杂志编排所使用的主流文档格式。DOC和DOCX是一种纯流式文档,显示打印时由内容驱动产生新页;INDD文档则是页面和流式内容相结合的形式,创建编辑文档时,先建页,再添加内容框,然后在内容框内输入流式内容。INDD的这种特点使得其很适合书籍杂志对版面复杂灵活的控制,可在页面任意位置添加内容框以显示独立的内容。INDD的内容框与DOC和DOCX的页面正文区很相似也可以分栏。在流式内容方面,INDD与DOC和DOCX则是基本相似的,主要内容都是段落或表,内容样式也遵循CSS样式叠加继承逻辑。
PDF是与操作系统、应用程序、硬件无关的文件存储、显示格式。是目前出版业最常用的文档格式,能准确地再现原稿的每一个字符、颜色及图像。
虽然DOC、DOCX及PDF、PostScript文件相关标准已经开放,但由于流式文档内容没有坐标信息,导致各种显示软件打开文件后呈现格式不统一,难以转换为格式固定统一的版式文档。
在流式文档向版式文档转换的过程中,排版软件是最重要最复杂的软件制品,其核心技术掌握在少数几家大公司手中,收费昂贵且使用不便。并且,目前市面上没有能同时对DOC和DOCX、INDD文档进行排版并转换为版式文档的方法。本项发明填补了国内在这一技术领域的空白。
发明内容
本发明提供了一种通用DOC和DOCX及INDD文档排版引擎及方法,解决了流式文档进行版式文档的排版问题,其技术方案如下所述:
一种通用DOC和DOCX及INDD文档排版引擎,包括流式文档模型和版式内存文档模型,分别用于将待处理文档生成流式文档内存模型,以及将流式文档内存模型形成版式内存文档;所述流式文档模型包括文档解析器、文档预处理器、文档线性化处理器和字体解析器,对待处理文档依次进行的操作为读取文档、载入引用的外部文档、处理段落样式及字符格式、加载文档中用到的字体;所述版式内存文档模型包括布局控制器、页排版器、内容框排版器、内容栏排版器和排版后续处理器,对流式文档内存模型依次进行处理,形成最终的版式内存文档。
所述文档解析器用于读取待处理文档的各部分内容,包括解析待处理文档中的布局定义和样式定义,以及解析待处理文档的内容及格式,进而生成流式文档模型StyledDocument中相应的布局、样式及内容元素,根据待处理文档的属性指示,选择对应的DOC解析器、DOCX解析器或INDD解析器。
所述文档线性化处理器包括以下内容:(1)分析待处理文档中所有段落的每一个字符,建立段落的字符模型;(2)处理段落及字符样式,依据CSS样式规则及内容的样式设置计算出每个字符的具体样式,所述具体样式包括字体、字号大小、颜色、背景色、有无下划线或删除线;(3)分析段落字符模型进行单词识别,计算每个单词的宽高。
所述布局控制器用于启动对流式文档内存模型的核心排版功能,其包括Word文档布局控制器和InDesign文档布局控制器;所述Word文档布局控制器根据当前页码选择相应页面布局,然后启动页排版器排版当前页;所述InDesign文档布局控制器扫描文档每一页及其基本页,然后启动页排版器排版InDesign文档的当前页及其基本页。
所述页排版器包括Word页排版器和InDesign页排版器;所述Word页排版器用于检查当前页是否有页眉页脚,如果有先排版页眉页脚的内容,计算得到页眉页脚的高度,接下来计算确定正文可显示区大小;Word页排版器为页眉页脚及正文动态计算内容框的坐标、宽高并在版式文档页中创建内容框,然后启动内容框排版器;InDesign页排版器扫描一页中所有内容框,并按每个内容框指定的坐标和宽高在版式文档页中创建内容框,然后启动内容框排版器。
所述内容框排版器用于检查当前内容框分几栏及每栏的宽度,在相应版式文档内容框中创建内容栏,并将内容栏关联到内容的显示容器中,然后启动内容栏排版器,将当前内容排版放入内容栏;所述所述内容栏排版器用于扫描流式文档内存模型中节的内容,如果当前内容为段落,启动段落排版器,如果为表则启动表排版器。
所述表排版器设置有表脚行功能,支持对表列进行计算功能,包括求最大值、最小值、平均值、求和;当一个表被分在不同页面时,表脚行在每页都会显示,表脚行的表格内容是其所在列数值计算的结果,且所述表头表格不参与计算,所在列的每个表格只能有一个段落,多于一个段落时,只处理第一个段落。
一种通用DOC和DOCX及INDD文档排版方法,包括以下步骤:
S1:将待处理文档通过文档解析器生成流式文档内存模型;
S2:将流式文档内存模型进行预处理:查找并载入待处理文档中引用的外部文档,查找并收集待处理文档的目录定义及内容项,以及计算并插入待处理文档的段落的数字编号,其中,外部文档通过文档解析器进行解析并插入主文档相应位置;
S3:通过文档线性化处理器,将预处理后的流式文档内存模型进线性化处理,处理段落样式及字符格式;
S4:通过字体解析器进行字体加载及解析;
S5:根据输入文档的文档类型选择相应的布局控制器,其中Word文档布局控制器根据当前页码选择相应页面布局,然后启动页排版器排版当前页;InDesign文档布局控制器扫描文档每一页及其基本页,然后启动页排版器排版当前页及其基本页;
S6:调用页排版器:Word页排版器为页眉页脚及正文动态计算内容框的坐标、宽高并在版式文档页中创建内容框;InDesign页排版器扫描一页中所有内容框,并按每个内容框指定的坐标和宽高在版式文档页中创建内容框;
S7:调用内容框排版器:用于检查当前内容框分几栏及每栏的宽度;
S8:调用内容栏排版器;扫描节内容,如果当前内容为段落,启动段落排版器,继续步骤S9,如果为表则启动表排版器,跳转到步骤S11;
S9:调用段落排版器:根据段落样式,计算得出段落显示区,启动行排版器对段落内容进行计算断行处理;
S10:调用行排版器:以当前内容第一个单词的高度从内容栏申请一行空间,扫描计算每个字符,直到该行空间满或段落内容结束,如果该行空间已满段落还有剩余内容,则进行换行处理,当一行排版结束,根据行内容高度及段落行高样式确定该行在版式文件内容栏的精确位置和所占空间,如果内容栏剩余空间不足,则进行段落的分页处理;每调用一次行排版器就生成版式内存文档中的一行内容,并放入版式内存文档的内容栏中,段落排版器循环调用行排版器,直到该段落内容结束;
S11:调用表排版器:根据流式文档中表的样式和内容建立相应的版式文档表行列结构,并将其放入版式文档中,每一个表格可看成一个内容栏,表排版器又会调用内容栏排版器对每一个表格进行排版;重复排版计算文档的所有内容,直到完成整个文档的排版计算;
S12:调用排版后续处理器:计算文档总页数、替换页码引用、内容对齐以及表列计算工作,对部分内容的坐标作调整;
S13:调用版式文档转换器:采用在内外存储介质相互转换的文档格式,以用于持久化保存排版结果。
进一步的,步骤S10中,进行换行处理时,影响换行的因素包括空格、连字符、标点符号、不换行空格;涉及下面三种规则:
(1)对西文而言,空格是识别单词的依据,如果段落被设定不允许在连字符换行,则需要在空格处换行;
(2)否则检测当前单词是否有显式连字符,如果没有则在字典表里查找当前单词的隐含连字符,如果有显式或隐含连字符,则在离行末最近的连字符换行;
(3)无论行末有多少空格,都会被忽略,标点符号不能出现在一行的起始位置;不能在不换行空格处换行;
按此规则,行排版器检测当前字符处是否能换行,如果不能则从行末向行首方向搜索换行点,如果直到行首也找不到换行点,则忽略所有规则,直接在当前字符处换行。
进一步的,步骤S11中,表排版器根据流式文档中表的样式和内容建立相应的版式文档行列结构,并将其放入版式文档中,包括以下步骤:
(1)确定表的列数,建立二维数组并根据每个表格的跨行、跨列属性确定表格在表中的具体行列位置;
(2)计算得出每个表格的宽度,根据表格线宽和内边距计算得出其内容栏;
(3)启动内容栏排版器排版计算表格内容,由表格内容排版计算结果和所在行的行高属性共同确定每个表格的高度,进而确定所在行的高度,随后反向统一该行所有表格高度,所有表格排版结束后整个表的高度就确定了;
(4)如果当前内容栏能容纳下这个表,则将其直接放入内容栏,否则进行表的分页处理;
因为段落孤行控制的原因,当排满一页时并不知道本段落在下一页还有几行,因此分页的处理被设计为下一页第一个段落排版结束时触发,即下一页第一个段落排版结束时,对上一页做分页控制,检测是否有内容需要移到下一页;如果下一页第一行是孤行且其所在段落有内容在上一页,则从上一页移动一行到下一页,然后再查找上一页的分页点。
所述通用DOC和DOCX及INDD文档排版引擎及方法,能对主流办公文档DOC、DOCX及Adobe书籍出版、杂志编排文档INDD进行排版计算,排版计算结果可持久化保存为与具体输出格式或显示设备无关的文件,也可直接输出为PDF、PostScript、PCL等主流的版式文件格式。
附图说明
图1是所述通用DOC和DOCX及INDD文档排版引擎的应用逻辑示意图;
图2是所述流式文档模型的架构示意图;
图3是所述版式内存文档模型的架构示意图;
图4是所述通用DOC和DOCX及INDD文档排版方法的流程示意图。
具体实施方式
本发明提供的通用DOC和DOCX及INDD文档排版引擎及方法,能同时兼容DOC、DOCX及INDD的流式文档描述模型;基于此文档模型,实现一系列对待处理文档的内容进行排版计算,成功输出高保真的版式文档结果。本发明的文档排版引擎、具体处理方法如下:
如图1所示,一种通用DOC和DOCX及INDD文档排版引擎Composer,包括流式文档模型和版式内存文档模型,分别用于将待处理文档生成流式文档内存模型,以及将流式文档内存模型形成版式内存文档。所述流式文档模型包括文档解析器、文档预处理器、文档线性化处理器和字体解析器,对待处理文档依次进行的操作为读取文档、载入引用的外部文档、处理段落样式及字符格式、加载文档中用到的字体;所述版式内存文档模型包括布局控制器、页排版器、内容框排版器、内容栏排版器和排版后续处理器,对流式文档内存模型依次进行处理,从整体到细节形成最终的版式内存文档。
一、流式文档模型StyledDocument
如图2所示,为同时兼容DOC、DOCX及INDD文档格式,树形结构的流式文档模型StyledDocument可以用两个分支描述文档,一个分支为文档布局分支,另一分支为文档内容分支。待处理文档的属性中有一项指示该文档是DOC和DOCX还是INDD。所述文档布局分支首先处理的是多个页面,每个页面处理的是多个内容框,每个内容框中形成为内容栏。所述文档内容分支则是以节为单位,每节涉及有段落或表,对于段落来说,涉及有文字、图片和field(字段),表格的内容可以是段落和表,表则由表行形成,表行包含表格。
1、文档解析器DocumentParser
所述文档解析器用于读取待处理文档的各部分内容,包括解析待处理文档中的布局定义和样式定义,以及解析待处理文档的内容及格式,进而生成流式文档模型StyledDocument中相应的布局、样式及内容元素。涉及的文档解析器包括DOC解析器、DOCX解析器和INDD解析器,根据待处理文档的属性指示,判断该文档是DOC和DOCX还是INDD,从而选择对应的解析器。
2、文档预处理器Preprocessor
所述文档预处理器用于搜索待处理文档的全文内容,查找并载入待处理文档中引用的外部文档。对于外部文档,需要查找并收集外部文档的目录定义及内容项;在外部文档的引用处,计算并插入引用外部文档段落的数字编号。
3、文档线性化处理器TextStoryBuilder
所述文档线性化处理器用于处理以下内容:(1)分析待处理文档中所有段落的每一个字符,建立段落的字符模型;(2)处理段落及字符样式,依据CSS样式规则及内容的样式设置计算出每个字符的具体样式(如字体、字号大小、颜色、背景色、有无下划线或删除线等);(3)分析段落字符模型进行单词识别,计算每个单词的宽高。
4、字体解析器FontReader
所述字体解析器用于负责加载解析待处理文档中用到的字体。待处理文档中的每一个字符的宽高都由其字体文件所定,要计算确定待处理文档内容的坐标,必须精确计算每个字符的宽高。所述字体解析器加载字体文件,解析字符的轮廓、基线等属性,为整篇待处理文档的排版计算奠定基础。
通过上述流式文档模型的几个组件,实现了将待处理文档生成流式文档内存模型。
二、版式内存文档模型
如图3所示,所述版式内存文档模型依次从页、内容框、内容栏、行和表、文字和图片进行处理。其中,表由表行组成,每个表行中的表格内容又可能会涉及到内容栏。从而将流式文档内存模型从整体到细节,形成版式内存文档。
1、布局控制器LayoutController
所述布局控制器用于启动对流式文档内存模型的核心排版功能,根据INDD文档以页为主导组织文档,或结合DOC和DOCX文档的每节都有的页面设置,可将每节看成一系列可自动选择创建的页,以及引用的外部文档也可以页的形式插入主文档。
所述布局控制器分为Word文档布局控制器和InDesign文档布局控制器,根据输入的待处理文档的文档类型选择相应的布局控制器。文档布局主要是指页面大小、方向、页边距、页眉/页脚、不同首页、不同奇偶页、内容显示区分栏等信息。
Word文档完全以流式内容驱动,以节为单位进行组织,每节指定了相应布局,Word文档布局控制器根据当前页码选择相应页面布局,然后启动页排版器排版当前页。对Word文档而言,如果正文内容框已满正文还有剩余内容,Word页排版器将在版式文档中创建新页,以继续排版剩余正文内容。
InDesign文档主要以页及页中内容框驱动,内容框中为流式内容,同一页或不同页中的内容框可连接起来,内容可在连接起来的内容框中流动。InDesign的每页可关联一些基本页,最终显示或输出的页面内容为InDesign的每页及其基本页的内容叠加。InDesign文档布局控制器扫描文档每一页及其基本页,然后启动页排版器排版当前页及其基本页。
2、页排版器PageComposer
所述页排版器包括Word页排版器和InDesign页排版器,所述Word页排版器用于检查当前页是否有页眉页脚,如果有先排版页眉页脚的内容,计算得到页眉页脚的高度,接下来计算确定正文可显示区大小。Word页排版器为页眉页脚及正文动态计算内容框的坐标、宽高并在版式文档页中创建内容框,然后启动内容框排版器。
InDesign页排版器扫描一页中所有内容框,并按每个内容框指定的坐标和宽高在版式文档页中创建内容框,然后启动内容框排版器。
3、内容框排版器FrameComposer
所述内容框排版器用于检查当前内容框分几栏及每栏的宽度,在相应版式文档内容框中创建内容栏,并将内容栏关联到内容的显示容器中,然后启动内容栏排版器,将当前内容排版放入内容栏。Word文档和InDesign文档的内容框排版器采用相同的逻辑,因此排版引擎处理逻辑在这里得到统一。
4、内容栏排版器ColumnComposer
所述内容栏排版器用于扫描流式文档内存模型中节的内容,如果当前内容为段落,启动段落排版器,如果为表则启动表排版器。
4.1段落排版器ParagraphComposer
所述段落排版器用于根据段落样式,比如缩进、前后间隔,计算得出段落显示区,启动行排版器对段落内容进行计算断行处理。
4.11行排版器LineComposer
所述行排版器用于以当前内容第一个单词的高度从内容栏申请一行空间,扫描计算每个字符,直到该行空间满或段落内容结束,如果该行空间已满段落还有剩余内容,则进行换行处理,当一行排版结束,根据行内容高度及段落行高样式确定该行在版式文件内容栏的精确位置和所占空间,如果内容栏剩余空间不足,则进行段落的分页处理。在这一阶段同时处理制表符、字符间距、字符缩放等逻辑。
4.2表排版器TableComposer
所述表排版器用于根据流式文档中表的定义在版式文档中创建相应的表结构,其包括以下步骤:
(1)确定表的列建立二维数组,并根据每个表格的跨行、跨列属性确定表格在表中的具体行列位置;
(2)计算得出每个表格的宽度,根据表格线宽和内边距计算得出其内容栏;
(3)启动内容栏排版器排版计算表格内容,由表格内容排版计算结果和所在行的行高属性共同确定每个表格的高度,进而确定所在行的高度,随后反向统一该行所有表格高度;
(4)所有表格排版结束后整个表的高度就确定了,如果当前内容栏能容纳下这个表,则将其直接放入内容栏,否则进行表的分页处理。
本发明除了支持DOC、DOCX及INDD文档本身功能外,还创造性地增强了表这一重要文档元素的功能,新增了表脚行功能,支持对表列进行如求最大值、最小值、平均值、求和等Excel表才具有的常用功能。
类似于表头行,当一个表被分在不同页面时,表脚行在每页都会显示,通常表脚行的表格内容是其所在列数值计算的结果。该创新使得DOC、DOCX及INDD文档能很好地应用于财务、金融、销售等对数据计算和展示有需求的领域。该功能需要使用基于微软Word和Adobe InDesign开发的文档设计插件,且用于计算的表格内容为数值类型,本发明规定表头表格不参与计算,当然,所在列的每个表格只能有一个段落,多于一个段落时,只处理第一个段落。
5、排版后续处理器Postprocessor
所述排版后续处理器用于当完成整个文档的排版计算后,需要对排版结果的版式内存文档做一些后续处理。版式内存文档中有些内容只有在整个文档排版计算完后才能确定,比如页码引用(引用文档中其他部分所在页码)、总页数、内容对齐、表列计算等工作,当然对部分内容的细小修改可能需要调整其坐标,但不会再进行换行的处理。
DOC和DOCX和INDD都支持有对页码的引用,比如在待处理文档目录项后,存在引用该目录项对应内容所在页码,用户点击目录项,将跳转到对应页。一个待处理文档的目录通常位于文档开始,排版目录项时并不知道其对应内容在哪一页,而是要等到整个文档排版完成后才能确定。因此在排版页码引用时暂时用数字1,整个文档排版完成后,后续处理器查找目录项对应内容的实际页码并替换掉目录项后的页码。
类似地,DOC和DOCX和INDD支持对总页数的引用,一般在页脚处。只有当整个文档排版完成后才能确定总页数,后续处理器也负责检测文档中对总页数的引用,然后进行替换。
页面内容竖直方向的对齐及段落内容水平方向的对齐也可以在后续处理阶段进行处理。
排版后续处理器还检测文档的每一个表是否有列计算,如果有,则搜集相应列的数值(不包括表头行、表脚行表格),根据定义好的计算方法(求最大值、最小值、平均值、求和)求出值,然后将计算结果放入表脚行表格。
所述版式文档内存模型,将流式文档内存模型形成版式内存文档,此时的版式内存文档是位于内存里面存放的版式文档。
三、版式文档转换器,或称为版式内存文档至外存格式转换器Paged2DIFDocumentConvertor
下表为版式外存文档的存储格式:
排版计算结果的版式内存文档可直接输出为PDF/PostScript/PCL等版式文件,但不能输出到外部存储设备以持久保存。为了将排版计算结果持久化保存,以实现一次计算多次输出,本发明还采用了一种与打印显示设备无关(Device Independent Format)的版式文档存储格式DIFDocument。
如图4所示,一种通用DOC和DOCX及INDD文档排版方法,包括以下步骤:
步骤S1:将待处理文档通过文档解析器生成流式文档内存模型;
根据输入的待处理文档类型,启动相应的文档解析器DocumentParser,DocParser、DocxParser或InddParser,生成通用的流式文档内存模型StyledDocument。
步骤S2:将流式文档内存模型进行预处理:查找并载入待处理文档中引用的外部文档,查找并收集待处理文档的目录定义及内容项,以及计算并插入待处理文档的段落的数字编号。
S21:查找并载入文档中引用的外部文档;
文档预处理器Preprocessor搜索待处理文档的全文,查找并载入待处理文档中引用的外部文档,本方法支持在主文档(待处理文档)中引用别的DOC、DOCX、INDD、PDF、TIFF文档,如果找到外部文档,将其通过文档解析器进行解析并插入主文档相应位置。
插入引用的外部文档时,根据外部文档类型,选择相应的文档解析器如DocParser、DocxParser、InddParser或加载器PDFLoader、TIFFLoader。
引用的DOC和DOCX/INDD经解析后是一个StyledDocument,根据引用方式(Content-With-Layout还是Content-Only)决定如何插入主文档。如果是Content-With-Layout方式,则将主文档插入点所在节分开成两节,然后插入引用文档所有页(对DOC和DOCX而言,即带页面设置的节);如果是Content-Only(只有DOC和DOCX能以Content-Only方式引用),则将文档所有段落或表提取出来,插入到主文档。
引用PDF和TIFF文档可以指定页范围,每选择的一页在插入主文档后作为独立一页。
S22:查找并收集目录定义及内容项,预处理阶段收集待处理文档的目录定义及内容项可缓存并提高目录创建效率。如果设计文档时插入目录后又增加了内容,需要手动更新目录才能添加新目录项,尤其是本发明涉及到引用外部文档,更需要在外部文档都加载后,由预处理器在整个文档中搜集目录项以更新文档中的目录。
本发明能够灵活的引用外部文档,使用特有的文档设计插件,用户可以方便地在DOC和DOCX文档中引用另一个DOC和DOCX、PDF、INDD、TIFF文档。设计流式文档时,利用文档设计插件提供的功能,在文档中插入一个对外部文档的引用,该外部文档的内容并不在设计时加载进流式文档,而是在流式文档被排版转换成版式文档是由排版引擎加载并排版。该项创新有利于大型项目中用户按各项子功能单独设计文档,需要时又能方便灵活地合并文档。引用外部文档功能的限制与所引用的文档类型和在主文档中的位置有关,如果引用文档为PDF、INDD、TIFF,则只能以页为单位插入主文档;如果引用文档为DOC和DOCX,则载入时既可以保持引用文档的原有布局(Content-With-Layout方式),也可以舍弃掉引用文档的布局而只提取段落、表等内容(Content-Only方式)。自然地,在表、页眉/页脚、文本框里只能以纯内容(Content-Only方式)引用DOC和DOCX文档。这种对外部文档的引用关系还可以是嵌套的,即一个外部文档还可以引用另一个外部文档。
S23:计算并插入段落的数字编号。在流式文档中,段落的数字编号是以编号样式的形式设置在段落上的,在版式内存文档模型进行排版前需根据编号样式生成对应的数字或字符插入到段落的起始位置。
步骤S3:通过文档线性化处理器,将预处理后的流式文档内存模型进线性化处理,处理段落样式及字符格式;
以DOM表示的待处理文档的模型不便于排版过程中对内容的定位及单词识别,因此排版时需要将待处理文档的DOM结构做线性化处理。比如节内容转换为段落或表序列,将表转换为表行序列,将表行转换为表格序列,将段落转换为字符序列。
所述文档线性化处理器用于处理以下内容:(1)分析待处理文档中所有段落的每一个字符,建立段落的字符模型;(2)处理段落及字符样式,依据CSS样式规则及内容的样式设置计算出每个字符的具体样式(如字体(宋体、楷体...)、字号大小、颜色、背景色、有无下划线或删除线等);(3)分析段落字符模型进行单词识别,计算每个单词的宽高。
步骤S4:通过字体解析器FontReader进行字体加载及解析;
在将段落转换为字符序列的过程中,已经能知道文档中用到的具体字体,此时即可加载解析字体文件,用于接下来的字符计算。主要用到的字体信息有字符的宽度、高度、基线,字符对字距(kerning)等信息。一种字体一般分为普通、粗体、斜体、粗斜体四类,分别对应四个字体文件,计算时根据字符的粗体斜体设置选择相应的字体数据。
步骤S5:调用文档布局控制器LayoutController
布局控制器分为Word文档布局控制器和InDesign文档布局控制器,根据输入文档的文档类型选择相应的布局控制器。文档布局主要是指页面大小、方向、页边距、页眉/页脚、不同首页、不同奇偶页、内容显示区分栏等信息。
Word文档完全以流式内容驱动,以节为单位进行组织,每节指定了相应布局,Word文档布局控制器根据当前页码选择相应页面布局,然后启动页排版器排版当前页。对Word文档而言,如果正文内容框已满正文还有剩余内容,Word页排版器将在版式文档中创建新页,以继续排版剩余正文内容。
InDesign文档主要以页及页中内容框为驱动,内容框中为流式内容,同一页或不同页中的内容框可连接起来,内容可在连接起来的内容框中流动。InDesign的每页可关联一些基本页,最终显示或输出的页面内容为InDesign的每页及其基本页的内容叠加。InDesign文档布局控制器扫描文档每一页及其基本页,然后启动页排版器排版当前页及其基本页。
步骤S6:调用页排版器
所述页排版器包括Word页排版器和InDesign页排版器,Word页排版器的处理如下所述:
S61:Word页排版器检查当前页是否有页眉页脚,如果有,则先排版页眉页脚的内容,计算得到页眉页脚的高度,然后就可计算得到正文显式区大小。如果没有页眉页脚,正文显示区就等于页面大小减去页边距。
S62:Word页排版器为页眉页脚及正文动态计算内容框的坐标、宽高并在版式文档页中创建内容框,然后启动内容框排版器。
InDesign页排版器的处理如下所述:
InDesign页排版器扫描一页中所有内容框,并按每个内容框指定的坐标和宽高在版式文档页中创建内容框,然后启动内容框排版器。
步骤S7:调用内容框排版器
内容框排版器检查当前内容框,判断当前内容框分几栏以及每栏的宽度,在相应版式文档内容框中创建内容栏,并将内容栏关联到内容的显示容器中,然后启动内容栏排版器,将当前内容排版放入内容栏。Word文档和InDesign文档的内容框排版器采用相同的逻辑,因此排版引擎处理逻辑在这里得到统一。
步骤S8:调用内容栏排版器
内容栏排版器扫描节内容,如果当前内容为段落,启动段落排版器,继续步骤S9,如果为表则启动表排版器,跳转到步骤S11。
步骤S9:调用段落排版器
根据段落样式,比如缩进、前后间隔,计算得出段落显示区,启动行排版器对段落内容进行计算断行处理。
步骤S10:调用行排版器
以当前内容第一个单词的高度从内容栏申请一行空间,扫描计算每个字符,直到该行空间满或段落内容结束,如果该行空间已满段落还有剩余内容,则进行换行处理,当一行排版结束,根据行内容高度及段落行高样式确定该行在版式文件内容栏的精确位置和所占空间,如果内容栏剩余空间不足,则进行段落的分页处理。在这一阶段要处理制表符、字符间距、字符缩放等逻辑。
其中,影响换行的因素主要有空格、连字符、标点符号、不换行空格等。对西文而言,空格是识别单词的依据,如果段落被设定不允许在连字符换行,则需要在空格处换行,否则检测当前单词是否有显式连字符,如果没有则在字典表里查找当前单词的隐含连字符,如果有显式或隐含连字符,则在离行末最近的连字符换行;无论行末有多少空格,都会被忽略(即不占行空间);一般而言,标点符号不能出现在一行的起始位置;不能在不换行空格处换行。按此规则,行排版器检测当前字符处是否能换行,如果不能则从行末向行首方向搜索换行点,如果直到行首也找不到换行点,则忽略所有规则,直接在当前字符处换行。算法伪代码如下,
每调用一次行排版器就生成版式内存文档中的一行内容,并放入版式内存文档的内容栏中。段落排版器循环调用行排版器,直到该段落内容结束。
步骤S11:调用表排版器
根据流式文档中表的定义在版式内存文档中创建相应的结果,处理包括以下步骤:
(1)确定表的列数,建立二维数组并根据每个表格的跨行、跨列属性确定表格在表中的具体行列位置;
(2)计算得出每个表格的宽度,根据表格线宽和内边距计算得出其内容栏;
(3)启动内容栏排版器排版计算表格内容,由表格内容排版计算结果和所在行的行高属性共同确定每个表格的高度,进而确定所在行的高度,随后反向统一该行所有表格高度,所有表格排版结束后整个表的高度就确定了;
(4)如果当前内容栏能容纳下这个表,则将其直接放入内容栏,否则进行表的分页处理。
在流式文档模型中,一个表包含一行或多行,每行包含一个或多个表格,每个表格可以跨一行或多行跨一列或多列。表的总行数和总列数是确定的,因为表格跨行跨列的特性,如何确定某个表格在整个表中的哪一列,需要比较复杂的逻辑处理,具体代码如下。
其中,当内容已经排满一页(或一栏)还有剩余时,需要进行分页处理,分页主要考虑的因素包括段落的孤行控制、行连续、段连续设置,以及表行是否可拆分设置。如果段落要进行孤行控制,段落的第一行不能单独留在上一页,而需要拉到下一页,段落的最后一行不能单独放在一页开始位置,而需要从上一页拉下一行;如果段落设定了行连续,则不能从段落中间分页,需要把该段落在上一页的行全部拉到下一页;如果设定段连续,则需要将该段落与后面的内容(可以是段落也可以是表)放在同一页,排版检测到这样的段落在一页末尾时,需将该段所有行拉到下一页。当分页发生在表上时,需要考虑表行是否可拆分,表头行不可拆分,内容行如果不可拆分就将当前内容行移到下一页,此时需检测上一行是否为表头行,如果不是,还需检测上一行是否要与当前行保持连接,如果是则继续更上一行按此规则直到找到可分页的表行,如果找不到可分页表行,则将整个表移到下一页。循环执行段落与表的分页检测逻辑,直到找到可分页点,如果在整页都没找到可分页点,则忽略所有规则,直接在当前页满位置分页。
分页的算法伪代码如下:
需要指出的时,因为段落孤行控制的原因,当排满一页时并不知道本段落在下一页还有几行,因此分页的处理被设计为下一页第一个段落排版结束时触发,即下一页第一个段落排版结束时,对上一页做分页控制,检测是否有内容需要移到下一页。如果下一页第一行是孤行且其所在段落有内容在上一页,则从上一页移动一行到下一页,然后再查找上一页的分页点。
表排版器根据流式文档中表的样式和内容建立相应的版式文档表行列结构,并将其放入版式文档中。每一个表格可看成一个内容栏,表排版器又会调用内容栏排版器对每一个表格进行排版。
本发明提供的核心排版引擎就这样重复排版计算文档的所有内容,直到完成整个文档的排版计算。
步骤S12:调用排版后续处理器
该步骤计算文档总页数、替换页码引用、内容对齐(比如页竖直方向对齐、段落行水平方向)以及表列计算等工作,对部分内容的坐标作调整。
步骤S13:调用版式文档转换器
为了将排版计算结果持久化保存,以实现一次计算多次输出,一种与打印显示设备无关并可在内外存储介质相互转换的文档格式(DIFDocument)被采用,以用于持久化保存排版结果。
所述通用DOC和DOCX及INDD文档排版引擎及方法,能对主流办公文档DOC、DOCX及Adobe书籍出版、杂志编排文档INDD进行排版计算,排版计算结果可持久化保存为与具体输出格式或显示设备无关的文件,也可直接输出为PDF、PostScript、PCL等主流的版式文件格式。
Claims (10)
1.一种通用DOC和DOCX及INDD文档排版引擎,其特征在于:包括流式文档模型和版式内存文档模型,分别用于将待处理文档生成流式文档内存模型,以及将流式文档内存模型形成版式内存文档;所述流式文档模型包括文档解析器、文档预处理器、文档线性化处理器和字体解析器,对待处理文档依次进行的操作为读取文档、载入引用的外部文档、处理段落样式及字符格式、加载文档中用到的字体;所述版式内存文档模型包括布局控制器、页排版器、内容框排版器、内容栏排版器和排版后续处理器,对流式文档内存模型依次进行处理,形成最终的版式内存文档。
2.根据权利要求1所述的通用DOC和DOCX及INDD文档排版引擎,其特征在于:所述文档解析器用于读取待处理文档的各部分内容,包括解析待处理文档中的布局定义和样式定义,以及解析待处理文档的内容及格式,进而生成流式文档模型StyledDocument中相应的布局、样式及内容元素,根据待处理文档的属性指示,选择对应的DOC解析器、DOCX解析器或INDD解析器。
3.根据权利要求1所述的通用DOC和DOCX及INDD文档排版引擎,其特征在于:所述文档线性化处理器包括以下内容:(1)分析待处理文档中所有段落的每一个字符,建立段落的字符模型;(2)处理段落及字符样式,依据CSS样式规则及内容的样式设置计算出每个字符的具体样式,所述具体样式包括字体、字号大小、颜色、背景色、有无下划线或删除线;(3)分析段落字符模型进行单词识别,计算每个单词的宽高。
4.根据权利要求1所述的通用DOC和DOCX及INDD文档排版引擎,其特征在于:所述布局控制器用于启动对流式文档内存模型的核心排版功能,其包括Word文档布局控制器和InDesign文档布局控制器;所述Word文档布局控制器根据当前页码选择相应页面布局,然后启动页排版器排版当前页;所述InDesign文档布局控制器扫描文档每一页及其基本页,然后启动页排版器排版InDesign文档的当前页及其基本页。
5.根据权利要求1所述的通用DOC和DOCX及INDD文档排版引擎,其特征在于:所述页排版器包括Word页排版器和InDesign页排版器;所述Word页排版器用于检查当前页是否有页眉页脚,如果有先排版页眉页脚的内容,计算得到页眉页脚的高度,接下来计算确定正文可显示区大小;Word页排版器为页眉页脚及正文动态计算内容框的坐标、宽高并在版式文档页中创建内容框,然后启动内容框排版器;InDesign页排版器扫描一页中所有内容框,并按每个内容框指定的坐标和宽高在版式文档页中创建内容框,然后启动内容框排版器。
6.根据权利要求1所述的通用DOC和DOCX及INDD文档排版引擎,其特征在于:所述内容框排版器用于检查当前内容框分几栏及每栏的宽度,在相应版式文档内容框中创建内容栏,并将内容栏关联到内容的显示容器中,然后启动内容栏排版器,将当前内容排版放入内容栏;所述内容栏排版器用于扫描流式文档内存模型中节的内容,如果当前内容为段落,启动段落排版器,如果为表则启动表排版器。
7.根据权利要求6所述的通用DOC和DOCX及INDD文档排版引擎,其特征在于:所述表排版器设置有表脚行功能,支持对表列进行计算功能,包括求最大值、最小值、平均值、求和;当一个表被分在不同页面时,表脚行在每页都会显示,表脚行的表格内容是其所在列数值计算的结果,且所述表头表格不参与计算,所在列的每个表格只能有一个段落,多于一个段落时,只处理第一个段落。
8.一种通用DOC和DOCX及INDD文档排版方法,包括以下步骤:
S1:将待处理文档通过文档解析器生成流式文档内存模型;
S2:将流式文档内存模型进行预处理:查找并载入待处理文档中引用的外部文档,查找并收集待处理文档的目录定义及内容项,以及计算并插入待处理文档的段落的数字编号,其中,外部文档通过文档解析器进行解析并插入主文档相应位置;
S3:通过文档线性化处理器,将预处理后的流式文档内存模型进线性化处理,处理段落样式及字符格式;
S4:通过字体解析器进行字体加载及解析;
S5:根据输入文档的文档类型选择相应的布局控制器,其中Word文档布局控制器根据当前页码选择相应页面布局,然后启动页排版器排版当前页;InDesign文档布局控制器扫描文档每一页及其基本页,然后启动页排版器排版当前页及其基本页;
S6:调用页排版器:Word页排版器为页眉页脚及正文动态计算内容框的坐标、宽高并在版式文档页中创建内容框;InDesign页排版器扫描一页中所有内容框,并按每个内容框指定的坐标和宽高在版式文档页中创建内容框;
S7:调用内容框排版器:用于检查当前内容框分几栏及每栏的宽度;
S8:调用内容栏排版器;扫描节内容,如果当前内容为段落,启动段落排版器,继续步骤S9,如果为表则启动表排版器,跳转到步骤S11;
S9:调用段落排版器:根据段落样式,计算得出段落显示区,启动行排版器对段落内容进行计算断行处理;
S10:调用行排版器:以当前内容第一个单词的高度从内容栏申请一行空间,扫描计算每个字符,直到该行空间满或段落内容结束,如果该行空间已满段落还有剩余内容,则进行换行处理,当一行排版结束,根据行内容高度及段落行高样式确定该行在版式文件内容栏的精确位置和所占空间,如果内容栏剩余空间不足,则进行段落的分页处理;每调用一次行排版器就生成版式内存文档中的一行内容,并放入版式内存文档的内容栏中,段落排版器循环调用行排版器,直到该段落内容结束;
S11:调用表排版器:根据流式文档中表的样式和内容建立相应的版式文档行列结构,并将其放入版式文档中,每一个表格可看成一个内容栏,表排版器又会调用内容栏排版器对每一个表格进行排版;重复排版计算文档的所有内容,直到完成整个文档的排版计算;
S12:调用排版后续处理器:计算文档总页数、替换页码引用、内容对齐以及表列计算工作,对部分内容的坐标作调整;
S13:调用版式文档转换器:采用在内外存储介质相互转换的文档格式,以用于持久化保存排版结果。
9.根据权利要求8所述的通用DOC和DOCX及INDD文档排版方法,其特征在于:步骤S10中,进行换行处理时,影响换行的因素包括空格、连字符、标点符号、不换行空格;涉及下面三种规则:
(1)对西文而言,空格是识别单词的依据,如果段落被设定不允许在连字符换行,则需要在空格处换行;
(2)否则检测当前单词是否有显式连字符,如果没有则在字典表里查找当前单词的隐含连字符,如果有显式或隐含连字符,则在离行末最近的连字符换行;
(3)无论行末有多少空格,都会被忽略,标点符号不能出现在一行的起始位置;不能在不换行空格处换行;
按此规则,行排版器检测当前字符处是否能换行,如果不能则从行末向行首方向搜索换行点,如果直到行首也找不到换行点,则忽略所有规则,直接在当前字符处换行。
10.根据权利要求8所述的通用DOC和DOCX及INDD文档排版方法,其特征在于:步骤S11中,表排版器根据流式文档中表的样式和内容建立相应的版式文档表行列结构,并将其放入版式文档中,包括以下步骤:
(1)确定表的列数,建立二维数组并根据每个表格的跨行、跨列属性确定表格在表中的具体行列位置;
(2)计算得出每个表格的宽度,根据表格线宽和内边距计算得出其内容栏;
(3)启动内容栏排版器排版计算表格内容,由表格内容排版计算结果和所在行的行高属性共同确定每个表格的高度,进而确定所在行的高度,随后反向统一该行所有表格高度,所有表格排版结束后整个表的高度就确定了;
(4)如果当前内容栏能容纳下这个表,则将其直接放入内容栏,否则进行表的分页处理;
因为段落孤行控制的原因,当排满一页时并不知道本段落在下一页还有几行,因此分页的处理被设计为下一页第一个段落排版结束时触发,即下一页第一个段落排版结束时,对上一页做分页控制,检测是否有内容需要移到下一页;如果下一页第一行是孤行且其所在段落有内容在上一页,则从上一页移动一行到下一页,然后再查找上一页的分页点。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110418589.7A CN113011129A (zh) | 2021-04-19 | 2021-04-19 | 一种通用doc和docx及indd文档排版引擎及方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110418589.7A CN113011129A (zh) | 2021-04-19 | 2021-04-19 | 一种通用doc和docx及indd文档排版引擎及方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113011129A true CN113011129A (zh) | 2021-06-22 |
Family
ID=76388621
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110418589.7A Pending CN113011129A (zh) | 2021-04-19 | 2021-04-19 | 一种通用doc和docx及indd文档排版引擎及方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113011129A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116451671A (zh) * | 2023-06-16 | 2023-07-18 | 上海森亿医疗科技有限公司 | 文档格式数据加载渲染方法、终端、介质及web编辑器 |
CN117371446A (zh) * | 2023-12-07 | 2024-01-09 | 江西曼荼罗软件有限公司 | 一种病历文本排版方法、系统、存储介质及电子设备 |
-
2021
- 2021-04-19 CN CN202110418589.7A patent/CN113011129A/zh active Pending
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116451671A (zh) * | 2023-06-16 | 2023-07-18 | 上海森亿医疗科技有限公司 | 文档格式数据加载渲染方法、终端、介质及web编辑器 |
CN116451671B (zh) * | 2023-06-16 | 2023-11-07 | 上海森亿医疗科技有限公司 | 文档格式数据加载渲染方法、终端、介质及web编辑器 |
CN117371446A (zh) * | 2023-12-07 | 2024-01-09 | 江西曼荼罗软件有限公司 | 一种病历文本排版方法、系统、存储介质及电子设备 |
CN117371446B (zh) * | 2023-12-07 | 2024-04-16 | 江西曼荼罗软件有限公司 | 一种病历文本排版方法、系统、存储介质及电子设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11790029B2 (en) | System and method for converting the digital typesetting documents used in publishing to a device-specific format for electronic publishing | |
US4608664A (en) | Automatically balancing and vertically justifying a plurality of text/graphics-columns | |
US7315867B2 (en) | Document processing apparatus, document processing method, document processing program, and recording medium | |
EP0117406B1 (en) | Automatically balancing and vertically justifying text and/or graphics | |
US7313754B2 (en) | Method and expert system for deducing document structure in document conversion | |
JPH11316760A (ja) | 位置指示情報を使用してドキュメントの要約を生成する方法とシステム | |
CN104516867A (zh) | 一种表格重排方法和系统 | |
CN113011129A (zh) | 一种通用doc和docx及indd文档排版引擎及方法 | |
CN105159877A (zh) | 一种跨媒体自动排版系统及其方法 | |
US20200364452A1 (en) | A heuristic method for analyzing content of an electronic document | |
US7366978B1 (en) | Method and system for creating a grid-like coordinate system for addressing data contained in an irregular computer-generated table | |
US20240104290A1 (en) | Device dependent rendering of pdf content including multiple articles and a table of contents | |
JPH08161309A (ja) | 文書作成装置 | |
CN112199929A (zh) | 表格处理方法、装置、存储介质及电子设备 | |
JPH0438005B2 (zh) | ||
JP2004021746A (ja) | 検索結果文字列表示方法およびシステム | |
JP2014021694A (ja) | 携帯情報端末、携帯情報端末の表組表示方法、及び携帯情報端末の表組表示プログラム | |
US20230039280A1 (en) | Device dependent rendering of pdf content | |
Downes et al. | The amsart, amsproc, and amsbook document classes | |
JP7003457B2 (ja) | 文書再構成装置 | |
JPH0581247A (ja) | 文書整形方法 | |
JPS6231890A (ja) | ワ−ド・プロセツシング・における複合文字処理方法 | |
CN117494665A (zh) | 文档转换方法、装置、电子设备和存储介质 | |
JP3786436B2 (ja) | 表生成処理装置および方法 | |
CN116992855A (zh) | 文档处理方法、系统及相关设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |