将PDF文本转换为大纲?

将PDF文本转换为大纲?,pdf,inkscape,Pdf,Inkscape,有人知道如何将PDF文档中的文本矢量化吗?也就是说,我希望每个字母都是一个形状/轮廓,没有任何文本内容。我使用的是Linux系统,最好是开源或非Windows解决方案 上下文:我正在尝试编辑一些旧的PDF,我已经没有这些字体了。我想在Inkscape中这样做,但这将用通用字体替换所有字体,而且几乎不可读。我也一直在使用pdf2ps和ps2pdf来回转换,但字体信息仍保留在那里。因此,当我将它加载到Inkscape中时,它仍然看起来很糟糕 有什么想法吗?谢谢。我担心要将PDF矢量化,您仍然需要原始

有人知道如何将PDF文档中的文本矢量化吗?也就是说,我希望每个字母都是一个形状/轮廓,没有任何文本内容。我使用的是Linux系统,最好是开源或非Windows解决方案

上下文:我正在尝试编辑一些旧的PDF,我已经没有这些字体了。我想在Inkscape中这样做,但这将用通用字体替换所有字体,而且几乎不可读。我也一直在使用
pdf2ps
ps2pdf
来回转换,但字体信息仍保留在那里。因此,当我将它加载到Inkscape中时,它仍然看起来很糟糕


有什么想法吗?谢谢。

我担心要将PDF矢量化,您仍然需要原始字体(或大量工作)

我想到了一些可能性:

  • 使用
    pdftk
    转储未压缩的PDF,找出字体名称,然后在FontMonster或字体服务上查找它们

  • 为了保持字距(我猜字距和对齐是导致文本不可读的原因),使用一些字体来与字体紧密匹配

  • 尝试(再次
    pdftk
    将PDF转换为可使用
    sed
    编辑的PDF。此编辑将破坏PDF,但
    pdftk
    将能够将损坏的PDF重新压缩为可用的PDF)


    • 以下是您真正想要的-字体替换。您希望一些代码/应用程序能够遍历文件并对嵌入的字体进行适当的更改

      这项任务是可行的,从简单到不平凡。如果您有一种与文件中字体的度量相匹配的字体,并且用于该字体的编码是合理的,那么就很容易了。您可能可以使用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失败


      我现在放弃这个任务,但也许一两年后我会再试一次。同时,这些解决方案中可能有一种适合您。

      要实现这一点,您必须:

    • 将您的PDF拆分为单独的页面
    • 将PDF页面转换为SVG
    • 编辑你想要的页面
    • 重新组合页面
    • 这个答案将省略步骤3,因为这是不可编程的

      拆分PDF 如果您不希望使用编程方式分割文档,那么现代的方法是使用。在您最喜欢的shell中:

      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