跳到主要内容

ArtinTech Solution

Turning a Print PDF into Clickable Stories with Text Coordinates

标注新闻是把报纸搬到网上最慢的一步。编辑要在每篇新闻周围画框,让读者可以点击,然后再输入或粘贴标题和正文。可是送去印刷厂的 PDF 里,本来就有每一个字和它的精确位置。在 Inkfold 1.1 中,我们用上了这些坐标:画好框,标题和正文就自动出现。

在浏览器中读取文字

Inkfold 原本就用 pdf.js 在浏览器中导入 PDF,把每个版面渲染成图片,服务器无需额外软件。同一个库还通过 getTextContent() 提供文字层:一组文字片段,每个片段都有变换矩阵和宽度。把每个片段的矩阵与版面视图的变换相乘,就得到它在版面上的像素位置;字号是矩阵垂直向量的长度,片段的顶部就是基线减去这个字号。

片段并不是整行文字,所以我们按位置排序,把基线相同(误差在半个字高以内)且水平距离很近的片段合并成行。每一行都按版面尺寸的比例保存,与新闻区域使用同一套坐标系,并在版面图片上传后立刻发送到服务器。

如果有工具,也可以在服务器上处理

有些出版方更愿意在服务器上转换大型 PDF。只要服务器装有 Imagick 扩展或 Ghostscript,编辑就可以上传 PDF,由服务器以 150 dpi 渲染版面。如果还安装了 Poppler 的 pdftotext,它的 -bbox-layout 输出会给出同样的行坐标,我们会把它转换成相同格式。即使没有这些工具,一切仍然可以在浏览器中完成。

从一个框到标题和正文

编辑画出区域后,选行很简单:中心点落在框内的所有行。判断哪些行是标题,我们依靠排版而不是猜测:高度至少达到区域内最高一行 85% 的行。其余都是正文。

报纸正文是分栏排的,如果单纯从上到下读行,各栏内容就会交错。我们按左边缘把行分成若干栏,容差约为版面宽度的 3.5%,然后从左到右逐栏阅读,每栏从上到下。行尾用连字符断开的单词会重新拼合。

在 Inkfold 新闻标注工具中画出的区域,标题和正文来自 PDF
画出区域,标题和正文来自印刷 PDF。

同样的逻辑实现了两遍:PHP 版本让没有填写正文就保存的新闻在服务器端自动补全;JavaScript 版本让标注工具在画框的瞬间就填好表单,并为已有新闻提供“从 PDF 填写”按钮。整个版面的文字还会作为可搜索文本保存,网站搜索也能找到广告和图片说明里的词。

要点

  • 印刷 PDF 是结构化数据:用它的文字层,而不是重新打字。
  • 把所有坐标都换算成版面比例,让文字和区域共用一套坐标系。
  • 按字号识别标题,正文逐栏阅读。
  • 服务器端转换只是可选项,而不是硬性要求。

本系列上一篇:多语言、从右到左的阅读器。可以在 Inkfold 演示 的编辑后台试用新闻标注工具;软件可在 Charming Theme 购买。

有需要变成结构化内容的 PDF、扫描件或印刷文件?和我们聊聊 — ArtinTech Solution 为出版商开发文档处理工具。

Share this article

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注