将PDF文本转换为大纲?
有人知道如何将PDF文档中的文本矢量化吗?也就是说,我希望每个字母都是一个形状/轮廓,没有任何文本内容。我使用的是Linux系统,最好是开源或非Windows解决方案 上下文:我正在尝试编辑一些旧的PDF,我已经没有这些字体了。我想在Inkscape中这样做,但这将用通用字体替换所有字体,而且几乎不可读。我也一直在使用将PDF文本转换为大纲?,pdf,inkscape,Pdf,Inkscape,有人知道如何将PDF文档中的文本矢量化吗?也就是说,我希望每个字母都是一个形状/轮廓,没有任何文本内容。我使用的是Linux系统,最好是开源或非Windows解决方案 上下文:我正在尝试编辑一些旧的PDF,我已经没有这些字体了。我想在Inkscape中这样做,但这将用通用字体替换所有字体,而且几乎不可读。我也一直在使用pdf2ps和ps2pdf来回转换,但字体信息仍保留在那里。因此,当我将它加载到Inkscape中时,它仍然看起来很糟糕 有什么想法吗?谢谢。我担心要将PDF矢量化,您仍然需要原始
pdf2ps
和ps2pdf
来回转换,但字体信息仍保留在那里。因此,当我将它加载到Inkscape中时,它仍然看起来很糟糕
有什么想法吗?谢谢。我担心要将PDF矢量化,您仍然需要原始字体(或大量工作) 我想到了一些可能性:
- 使用
转储未压缩的PDF,找出字体名称,然后在FontMonster或字体服务上查找它们pdftk
- 为了保持字距(我猜字距和对齐是导致文本不可读的原因),使用一些字体来与字体紧密匹配
- 尝试(再次
将PDF转换为可使用pdftk
编辑的PDF。此编辑将破坏PDF,但sed
将能够将损坏的PDF重新压缩为可用的PDF)pdftk
- 以下是您真正想要的-字体替换。您希望一些代码/应用程序能够遍历文件并对嵌入的字体进行适当的更改
这项任务是可行的,从简单到不平凡。如果您有一种与文件中字体的度量相匹配的字体,并且用于该字体的编码是合理的,那么就很容易了。您可能可以使用iText或DotPdf(后者在评估之外不是免费的,而且是我公司的产品)。如果您修改了PDF2P,您可能也可以在修改字体的过程中进行管理
如果文件中使用的字体是具有创造性的重新编码的字体子集,那么您将陷入地狱,在进行更改时可能会有各种各样的痛苦。原因如下:
PostScript是在没有Unicode的时候设计的。Adobe使用一个字节作为字符,无论何时渲染任何字符串,要绘制的字形都取自一个名为编码向量的256个条目表。如果一个标准的编码没有你想要的,你会被鼓励根据只在编码上不同的标准字体来动态地制作字体
当Adobe创建Acrobat时,他们希望尽可能容易地从PostScript进行转换,以便对字体机制进行建模。当添加了将字体嵌入到PDF中的功能时,很明显这会使文件膨胀,因此PDF还包括了具有字体子集的功能。字体子集是通过使用现有字体并删除所有不使用的字形,然后将其重新编码到PDF中来创建的。编码向量和文件中的代码点之间可能没有标准关系-所有这些都可能会更改。相反,可能有一个嵌入式PostScript函数/ToUnicode,它将编码字符转换为Unicode表示形式
所以,是的,不平凡。对于那些在我之后的人: 我找到的最好的解决方案是使用evice作为SVG打印,或者使用pdf2svg程序,该程序可以通过Mint上的Synaptic访问。然而,Inkscape无法处理产生的SVG——它进入了一个无限循环,并显示错误消息:
File display/nr-arena-item.cpp第323行(?):断言项->状态&nr\u arena\u item\u state\BBOX失败
我现在放弃这个任务,但也许一两年后我会再试一次。同时,这些解决方案中可能有一种适合您。要实现这一点,您必须:
stapler burst file.pdf
将生成{file_1.pdf,…,file_N.pdf}
,其中1…N
是pdf页面。订书机本身使用的代码和分割PDF文件不是那么复杂。以下函数用于拆分文件并将各个页面保存在当前目录中。(无耻地从文件中复制)
导入数学
导入操作系统
从PyPDF2导入PdfileWriter、PdfileReader
def拆分(文件名):
打开(文件名)为inputfp时:
inputpdf=PdfFileReader(inputfp)
base,ext=os.path.splitext(os.path.basename(文件名))
#以零作为输出模板的前缀,以便保留顺序
#(第10页,第09页之后)
输出\u模板=“”。连接([
基础
'_',
'%0',
str(math.ceil(math.log10(inputpdf.getNumPages())),
“d”,
提取
])
对于范围内的页面(inputpdf.getNumPages()):
outputpdf=PdfielWriter()
outputpdf.addPage(inputpdf.getPage(第页))
outputname=输出模板%(第+1页)
以open(outputname,'wb')作为fp:
outputpdf.write(fp)
将单个页面转换为SVG
现在要将PDF转换为可编辑文件,我可能会使用
如果我们看一下文件,我们可以看到代码原则上没有那么复杂(假设输入文件名在filename
变量中,输出文件名在outputname
变量中)。下面是python中的一个最简单的工作示例。它需要以下文件和库:
导入操作系统
进口开罗
进口波普勒
def转换(inputname,outputname):
#将输入文件名转换为URI,以便
uri='file://'+os.path.abspath(inputname)
Pdfile=
pdf2svg input.pdf output.svg