在当前项目中,我需要在网页中显示PDF。现在我们正在使用Adobe PDF Reader嵌入它们,但我宁愿有更优雅的东西(读者不能很好地集成,它不能用透明区域覆盖,......)。
我设想了一些关闭谷歌文档的东西,它们将PDF显示为图像,但也允许从PDF中选择和复制文本(这是我们的要求)。
有人知道他们是怎么做到的吗?或者我们可以使用任何库来获得可比较的结果?
我知道我们可以将PDF分成服务器端的图像,但这不允许选择文本......
提前感谢您提供任何帮助
PS:基于Java的项目,使用wicket。
答案 0 :(得分:2)
我有一些建议,但实施这些东西肯定很难。祝你好运!
首先,使用像pdf-renderer(https://pdf-renderer.dev.java.net/)这样的库将PDF转换为图像。将这些图像存储在服务器上或使用缓存技术。将PDF转换为图像并不难。
然后,使用类型选择JavaScript库(http://www.typeselect.org/)在文本上叠加文本数据。此文本是可选的,而真实文本仍在原始图像中。要获得原始文本,请参阅下一个方法,或者自己动手,查看结论。
然后原始文本必须叠加在图像上,这很痛苦。
PDF规范允许将文本信息链接到字体。大多数文档使用Type-3或Type-1字体的子集(通常)使用标准字符集(我认为它是Unicode,但不确定)。如果您的PDF文档不包含标准字符集(即它已经定义了它自己),则无法知道哪些字符是哪些字形(符号),因此您无法转换为文本表示。
阅读PDF文档,阅读图形对象,解析说明(使用PDF规范以获得此过程中的更多信息)以呈现文本,将其转换为HTML。 HTML转换可以根据所使用的字体(它们的名称和属性)的参数选择适当的标签(例如<H1>
和<p>
,还有<b>
和<i>
)。图形对象中的指令(字母间距,行间距,大小,面)
您可以使用pdf-renderer库来读取和解析PDF文件,然后自己编写HTML转换器代码。这并不容易,并不涵盖所有PDF文档。
在这种方法中,您将失去文档的原始外观。有些PDF生成库不使用Adobe Font技术。这也是第一种方法的问题,即使你可以看到你无法选择它(但与官方Adobe Reader的行为相同,因此你可能会说不是很重要)。
您可以选择第一种方法,第二种方法或两者兼而有之。
我不会朝着光学字符识别(OCR)的方向发展,因为它在这样的问题上真的太过分了,因为它也有几个缺点。这种方法是谷歌使用的。如果存在无法识别的字符,则人类会进行处理。
如果你是人类处理的东西;您只能使用类型选择库和PDF到图像转换并自己进行OCR,这可能是解决问题的最简单方法(人类作为机器=智能廉价,大声笑)。