首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我在adobe acrobat pro Dc中打开pdf时,创建pdf的文本变得乱七八糟,我用的是itext5.5.12。

当我在adobe acrobat pro Dc中打开pdf时,创建pdf的文本变得乱七八糟,我用的是itext5.5.12。
EN

Stack Overflow用户
提问于 2017-09-09 00:15:18
回答 1查看 399关注 0票数 0

对于我们的应用程序,我们使用itext5.5.12创建pdf,使用ruby2.0.0和rails 4.2

从应用程序下载pdf到本地计算机并在Adobe Acrobat DC Pro中打开pdf后,文本变得混乱请参阅下面的pdf

请建议我如何解决这个问题

以下是我的代码

代码语言:javascript
复制
FileStream = Rjb::import('java.io.FileOutputStream')
LicenseKey = Rjb::import('com.itextpdf.license.LicenseKey')
PdfReader = Rjb::import('com.itextpdf.text.pdf.PdfReader')
Document = Rjb::import('com.itextpdf.text.Document')
PdfCopy = Rjb::import('com.itextpdf.text.pdf.PdfCopy')

def initialize(output_filename, pdf_files)
  itext_key = File.join(Rails.root, '/lib/jars/itextkey.xml')
  LicenseKey.loadLicenseFile(itext_key)
  @output_filename = output_filename
  @pdf_files = pdf_files
end

def bind
  doc =Document.new
  pdf_copy = PdfCopy.new(doc, FileStream.new(@output_filename))
  doc.open
  @pdf_files.each do |pdf|
    reader = PdfReader.new(pdf)
    pages = reader.getNumberOfPages()
    (1..pages).each do |p|
      pdf_copy.addPage(pdf_copy.getImportedPage(reader, p))
    end
    reader.close
  end
  doc.close
end
EN

回答 1

Stack Overflow用户

发布于 2017-09-12 01:22:28

你的代码

首先,我将您的代码移植到Java,并为您提供的文件运行它。Merging.java),但结果文件未损坏。因此,您提供的代码很可能不是问题所在。

后处理器

然后我分析了你的PDF文件,发现你的代码不是它的最终编辑器:

制片人

  • 说:

iText®5.5.12©2000-2017 iText集团NV (yash;试用版ka2lzaG9yZS5yYWNoYWtvbmRhQHlhc2guY29t);使用iText®7.0.1©2000-2016 iText集团NV iText进行修改

因此,另一个使用PDF7.0.1的例程对合并后的iText进行了后处理。

  • 是线性化的。

据我所知,iText 5.x和iText 7.0.x都不能创建线性化文件。

因此,由未知的PDF处理器进行的另一次转换发生了。

因此,使用iText 7的代码或未知的线性化后处理器可能导致了该问题。

问题本身

我比较了你提供的原件和你的结果。区别在于:

“3slc Dec.pdf”中的页面引用了未嵌入的Arial-BoldMT字体资源。因此,如果显示PDF的计算机具有该字体,则PDF被正确地显示。

不过,结果"39bdd9b1ba6501b44d401ee1b157ddb5631fcf36.pdf",中的匹配页面引用了Arial-BoldMT的字体资源,它突然包含了一个嵌入的字体文件。但是这个字体文件是不完整的,即仅仅是Arial-BoldMT!的一个子集

如果存在嵌入字体文件,则此嵌入字体文件用于显示以此字体绘制的文本,而不再是本地计算机上的字体。由于此处嵌入的字体文件不完整,因此不再显示大量字符。

再往下看,这个子集字体文件来自您的输入“5Sched of INS.pdf”。事实上,这个PDF中唯一的页面有一个用于Arial-BoldMT的字体资源和一个只包含该页面所需字符的字体文件。

因此,要么是使用iText 7的代码,要么是未知的线性化后处理器,似乎已经假定“5Sched of INS.pdf”中的Arial-BoldMT字体文件是完整的,并将其添加到其他页面上的Arial-BoldMT字体资源中。

这是一个错误吗?

这似乎是后处理器的一个有效的优化步骤,它做到了这一点,而不是一个错误,因为严格地说,“5Sed of INS.pdf”中的Arial-BoldMT字体资源是被破坏的;INS.pdf规范要求:

对于字体子集,字体的PostScript名称-字体的BaseFont条目和字体描述符的FontName条目的值-应以标记开头,后跟加号(+)。标签应恰好由六个大写字母组成;字母的选择是任意的,但同一PDF文件中的不同子集应具有不同的标签。

由于“5Sed of INS.pdf”中的Arial-BoldMT字体资源没有这个前缀,所以任何嵌入其中的字体文件都必须是完整的。但是嵌入的字体文件不是。

因此,允许哪个后处理器将字体文件添加到其他字体资源中,"5分的INS.pdf“文件是罪魁祸首,应该在使用前进行修复。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46120706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档