根据我的经验,学术界的旧论文经常出现“丑陋的 OCR”字符。
为了更好地描述这种现象,一个完美的例子是经典的 Donald Knuth 论文:https://www.cs.sjsu.edu/~mak/CS185C/KnuthStructuredProgrammingGoTo.pdf
该 pdf 包含正确的文本(它可以复制粘贴,并且粘贴的文本似乎是正确的),但在我看来,字符字体很糟糕,阅读起来很麻烦。
我该如何转换此 PDF 以使用干净的字体而不是当前的模糊字符?
答案1
PDF 看起来像是扫描的,然后进行了字符识别。这意味着您看到的字符实际上是填满页面的图像的一部分,而您选择的是位于图像上方的透明字符。
因此,没有真正的方法可以完全保留外观,同时使字体清晰易读。最好的办法是找到纯数字版本的论文。
编辑:根据您的评论,我编写了一个执行您想要的任务的小脚本:
require 'hexapdf'
# This processor changes the font color to black.
class ContentProcessor
attr_reader :result
def initialize
@result = ''.b
@serializer = HexaPDF::Serializer.new
end
TEXT_SHOW_OPERATORS = [:Tj, :"'", :'"', :TJ].each_with_object({}) {|op, h| h[op] = true }
def process(op, operands)
if TEXT_SHOW_OPERATORS[op]
@result << HexaPDF::Content::Operator::DEFAULT_OPERATORS[:g].
serialize(@serializer, 0)
@result << HexaPDF::Content::Operator::DEFAULT_OPERATORS[:Tr].
serialize(@serializer, 0)
end
if op != :Do
@result << HexaPDF::Content::Operator::DEFAULT_OPERATORS[op].
serialize(@serializer, *operands)
end
end
end
HexaPDF::Document.open(ARGV[0]) do |doc|
doc.pages.each do |page|
processor = ContentProcessor.new
HexaPDF::Content::Parser.parse(page.contents, processor)
page.contents = processor.result
page[:Contents].set_filter(:FlateDecode)
end
doc.write(ARGV[1], validate: false)
end
这使用HexaPDF 库在引擎盖下(nb 我是 HexaPDF 的作者)并且可以像这样运行:ruby script.rb INPUT.PDF OUTPUT.PDF
。
我已经在你的示例 PDF 上运行了脚本,并得到了此输出。大部分都还好,但是肯定有错误。