在ghostscript中渲染文本注释

时间:2013-03-06 22:50:59

标签: ghostscript

我正在使用Ghostscript将可搜索的PDF转换为图像PDF,以便可以使用像这样的命令行使用成像工具包查看它们:

gswin32 -o c:\temp\output%d.png -r300 -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -dDOINTERPOLATE -dSAFER -sDEVICE=png16m c:\temp\test.pdf

如果我添加-dDOPDFMARKS命令行参数,它会呈现注释标记,显示注释但不包含注释文本。

有谁知道如何让Ghostscript呈现注释文本?我没有任何运气就直接搜索了它的生命。

2 个答案:

答案 0 :(得分:3)

这是可能的,但它会是hacky。

Ghostscript是一个开源的postscript解释器。 PDF只是使用特殊预定义字典的postscript文件。在ghostscript 8.62或之前,字典位于目录/ lib中的postscript文本文件中。 / lib内部是一个文件pdf_draw.ps,用于将PDF呈现为您在.png文件中看到的内容。里面的pdf_draw.ps是/ drawidget的定义,它绘制了你看到的代表注释的小符号。在代码中的位置,整个注释可用,它只是没有被使用。

一个简单的演示是在/ drawwidget行的正下方添加如下所示的2行(just after the /drawwidget { %...),并在gswin32c的控制台中运行gswin32。这将导致在控制台窗口中呈现PDF时显示2行。

/drawwidget { % <scalefactor> <annot> drawwidget -
    dup   /Contents known {dup /Contents get  == } if 
    dup   /T known { dup /T get  == } if 

输出

(This is a test sticky note)
(Laurie Shufeldt)

它变得棘手的是定义如何处理注释,这就是为什么它们没有被显示。

在这种情况下,一种方法可能是在窗口小部件的顶部放置一个脚注引用,并在页面底部放置一个脚注,文本格式化对粘性的意图有意义。

另外,胶粘物可以是适当的图像,类似于它们在杂技演员中展开时的外观,但这将覆盖粘性下面的内容。

实施将如何实施将取决于实施的努力程度。编辑pdf_draw.ps非常hacky,但快速而简单。应该可以将hacks放入自己的文件中,并将它们作为命令行的一部分进行调用。如果将更改放入标题中,“它应该”在当前版本的ghostscript中工作,而不仅仅是旧版本。

预先定义允许的胶粘物的数量和脚注的固定位置将简化脚注的放置。如果stickies有超长的文本,文本将需要特殊的格式以允许换行,其中假定没有换行的短文本将更容易编程。

也许您只想从胶粘物中提取数据并将它们放入数据库中。如果是这种情况,上面的代码接近您的需要。

答案 1 :(得分:2)

如果没有看到您的PDF文件,我无法确定,但有几个可能的原因。您的注释可能会关闭,即打开PDF文件时不显示任何内容。它可能没有外观流,Ghostscript不会为所有注释类型制作外观流。

更新

provided PDF sample包含2个注释:第一个是'popup'注释;第二个是文本注释。

弹出注释基本上是交互式的,因为你可以打开和关闭它们,移动它们等等。但是,Ghostscript不支持交互式元素。所以你得到的是弹出窗口的图标,但你没有获得相关的文本注释。

目前无法使用Ghostscript呈现此文本。