导读:简述百度文库关于各种文档的转码和展示历程,早期的版式数据知足了PC端的各种文档阅读体验,随着业务发展的需求迭代,无线端的文档阅读体验亟需提高。版式数据转流式数据过程当中,简易的内容结构化知足了pdf数据在无线端的重排版。底层解析ooxml数据和细致的内容结构化,则带来了不错的word无线端重排版效果。从chart图片中“从无到有”抽取结构化的元数据,更为用户与文档的互动打开了想象空间html
全文3724字,预计阅读时间 9分钟。数据结构
1、百度文库中各种文档的展示
文库有数十亿海量文档,包括word,ppt,excel和pdf等十几种常见办公文档,核心基础服务是文档转码和展示。微服务
为了统一十几种文档的转码和展示方案,不依赖于原文件格式的开档软件,技术调研后,最终方案为任意文档转码为pdf格式,解析开源的pdf数据格式,加工后造成文库自有文档格式,在pc端、无线端排版和渲染。工具
PC端渲染采用源于PDF的xreader版式数据,版式数据指的是每一个元素(文字、图片)都有一个坐标信息和元素的宽高信息,以及其余的描述信息。每个文本片断、图片和其余矢量元素等根据坐标信息在当前版面固定显示。所以,版式数据比较适合用于在PC端等比例展示各种文档,版式排版的还原效果较好。字体
无线端的屏幕尺寸广泛较小,若是将版式数据等比例缩小后排版,整个版面中的文字、公式较小,给阅读带来不便,如图1所示。虽然能够放大显示,但显然增长了用户的操做成本。优化
图1 无线端采用版式数据进行等比例缩小的版式排版url
比较理想的方案是将版式数据转换成流式数据,根据不一样的无线端屏幕尺寸,进行重排版。区别于版式数据中每一个元素都有当前版面的坐标信息,流式数据没有坐标信息,有的是章节、栏、段落、公式和表格等结构化信息,大量的数据结构信息将最基础的文本、图片关联起来,造成结构化的文档内容,适合各类屏幕尺寸的自适应重排版。spa
2、文档内容结构化的技术探索
2.1 Retype流式数据(基于xreader版式数据)
文库早期文档内容“版式转流式”的方案,遍历xreader版式数据中的每一个元素,提取坐标信息x,y和元素的宽高w,h信息。比较接近的y认为是同一行数据,y接近的状况下,根据x和w拼接相邻的文本元素、链接相邻的文本和图片。而后就获得当前版面的全部行数据结构line,根据每一个line的y和h信息,将相邻line拼接为段落。经过判断当前line的x+w数据小于版面宽度、以特殊标点结尾,以及下一个line的x信息蕴含着段首缩进等状况,从而断定一个段落的结束。.net
以上是“版式转流式”方案的通用思路,当文档的版面结构较为复杂,好比论文、文献等存在大量多栏、图文绕排、表格脚注尾注的状况时,还须要进行range识别的预处理,将整个版面分析、切割成多个range结构,在每一个range内再进行“版式转流式”的通用方案,才能获得较好的效果。设计
这种方案从版式数据中提取了“段落、行“等结构化信息,有助于流式排版。但一些case显示这些结构化信息的准确率达不到百分百正确,存在“段落被强制换行,inline图片位置错误”等状况,且对“公式、图表chart和表格”等复杂结构化信息的提取能力较弱。
不一样于pdf文档中只有元素相对于版面的坐标信息且缺少内容结构化信息,office文档如word文档,源文档中存在结构化信息,只是在word转pdf的转码过程当中丢失了这些信息。所以,对文库占比较多的word文档提取结构化信息和提高无线端流式排版效果,成为阶段性的重要目标。
2.2 BDJson流式数据(基于ooxml数据)
微软office历史悠久,word存在许多版本,简化区分为doc二进制复合文档格式和docx的ooxml文档格式。Doc二进制复合文档格式较为复杂,且是微软的闭源项目,解析和转码的成本较高。为了简化方案,将doc转换成docx,而后核心方案就是解析docx格式,转码,产出BDJson格式流式数据。
OOXML是开源项目,基于zip+xml的格式,普通文本及其字符属性、段落属性的读取和解析较为方便,其自带章节、段落和表格等结构化信息,便于流式排版。基于本次排版需求,以及考虑到未来有word在线编辑的场景,方案设计为语义级别的精确解析文档,抽取内容和属性,组建office数据结构。
章节、段落等数据结构,遵循ooxml标准,从Document.xml中解析数据后便可组装成对应的数据结构。页眉页脚、脚注尾注等数据结构,Document.xml中存储的只是索引和基本信息,具体的区域内容须要从其余的xml文件中获取,按照索引的对应关系进行拼装,并插入到正文中的具体位置。
一些数据结构因office结构与html结构的差别性,须要作一些适配工做。例如常见的项目符号与编号,在word中能够有9层结构,每一层结构都有字符属性、段落属性、tab设置和图片编号等,须要兼容映射到html的ol、ul简易结构。表格中合并单元格的行跨、列跨和隐藏被合并单元格,在office和html中也是有很大差别,须要遍历整个表格,计算转换后进行兼容性转码。
此外,对一些在线编辑场景中涉及的数据结构,也作了提取和转码,例如将word中支持的多套公式数据“域公式、mathtype公式,omath公式”统一转码成LaTex数据格式,不只便于后续编辑,并且能够适配正文的字体和大小,总体排版效果更统一。
以上技术方案的实施,完美提取了word文档中的结构化信息,优化了现有文档转码和展示的流程,如图2所示。文档内容结构化信息,使得word文档无线端能够实现自适应的流式排版,大为提高了展现效果,如图3所示。
图2 文档转码和展示(版式,流式)
图3 文档无线端流式排版和公式LaTex展示
2.3 chart图****片(或pdf数据)中提取结构化数据
在论文、期刊和财经研报等特定类型的pdf文档中,常常会有一些图表chart信息,这些图表通常以“无结构的pdf数据、图片、背景图”的形式出现。提取这些图表信息,将元数据导入到excel中,让用户能够从新编辑、观测和生成新的chart,具备较大的产品价值。
现有的一些工具,通常都是让用户对文档中chart所在的区域range手动截图,而后人工选择坐标轴原点,输入坐标轴刻度等信息,对chart描边等一系列繁琐的操做,且数据提取的正确率不高。
Chart图片或无结构的pdf数据中提取结构化元数据的技术方案能够简化为两大模块:range识别,元数据提取。
2.3.1 Range识别
以pdf文档举例,首先遍历本页全部元素,将文本碎片span、图片等框选起来。原始span按y,x进行相邻merge,获得大一些的fragment, 进而聚合成line。line区域按文本数量和位置等信息,进行有效性判断,有些可消除。
搜索剩余空间内的空白区域,做为range的候选区域。获取页面设置信息,肯定页面内容范围。从上往下遍历,先把整行空白的range识别出来。按行遍历,若是line两端尚有空余,加2个两端的range。用当前的line去碰撞已有的range,若相交,将相交部分消去,会把原有range切成多个新的range。至此,获得紫色的range候选区域集合,如图4所示。
图4 range候选区域集合
遍历range候选区域集合,按range的位置、宽高进行相邻range的合并和从新组合,获得新的一组range,如图5所示。
图5 range候选区域集合(合并后)
过滤range(根据矩形大小、位置、先后的文本line,ocr的文本数量等信息),同时对range的边缘进行白边切割,最后获得有效range,如图6所示。
图6 range候选区域集合(过滤后)
2.3.2 元数据提取
经过range识别模块产出的range集合,能够进行下一步的元数据提取。不是全部range里都是chart,多是个简单图片、流程图等。
首先依据range信息,对当前页面截取range对应的图片,进行图像分析,初步断定是不是chart图片并进行初步的chart分类,例如柱状图、饼图,如图7所示。
图7 以图片形式展示的chart
以柱状图举例,基于像素分析和边缘提取算子的预处理,识别出x轴、y轴的候选线条,并依据长度、位置等信息,进行删选,最后获得xy轴,组成坐标体系。扫描xy轴上的刻度线,此时有较多干扰,可能偏差较大,经过像素对比和交叉验证,给轴线补充上刻度线。
完整、正确的坐标体系对于后续的chart元数据提取很重要。基于坐标体系,可将整个图片切割成多个subRange,对subRange中的小图进行ocr,获取其中的文本,便可拼装成chart的数据项、各个数据点,通过一系列的数据矫正和从新组合,从而获得整个chart的元数据,如图8所示。
图8 从chart图片中提取的元数据
===
3、文档内容结构化的后续发展
随着业务的发展,基于文档整页展示的基础上,如何给用户更好的文档展示和互动效果,对文档转码和展示技术提出了更高的要求,而这一切的基础正是提取细粒度的文档元素和对文档内容进一步的结构化识别和提取。
招聘信息
百度-文库研发部,团队致力于建设业界领先的在线互动式文档、音频等知识分享平台,十年来聚集了超9亿份高价值文档资料,拥有近40万认证做者和2万家专业权威机构,已成为中国领先的文档与知识服务平台。百度文库坚持以“让每一个人平等地提高自我”为目标,努力将知识尽量地分享到每个须要的角落。
诚邀iOS & Android小伙伴。
关注百度Geek说,公众号菜单栏点击内推便可。
推荐阅读
---------- END ----------
百度Geek说
百度官方技术公众号上线啦!
技术干货 · 行业资讯 · 线上沙龙 · 行业大会
招聘信息 · 内推信息 · 技术书籍 · 百度周边
欢迎各位同窗关注