对于我们的应用程序,我们使用itext5.5.12创建pdf,使用ruby2.0.0和rails 4.2
从应用程序下载pdf到本地计算机并在Adobe Acrobat DC Pro中打开pdf后,文本变得混乱请参阅下面的pdf

请建议我如何解决这个问题
以下是我的代码
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发布于 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“文件是罪魁祸首,应该在使用前进行修复。
https://stackoverflow.com/questions/46120706
复制相似问题