Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从pdf中提取文本层和背景层?_Php_Linux_Html_Pdf_Ghostscript - Fatal编程技术网

Php 如何从pdf中提取文本层和背景层?

Php 如何从pdf中提取文本层和背景层?,php,linux,html,pdf,ghostscript,Php,Linux,Html,Pdf,Ghostscript,在我的项目中,我必须用HTML5/CSS3做一个PDF查看器,应用程序必须允许用户添加注释和注释。事实上,我必须做一些与crocodoc.com非常相似的事情 起初,我想从PDF中创建图像,并允许用户创建区域并向该区域发布评论。不幸的是,客户端还希望在此PDF中导航,并仅在允许的部分(例如,段落或选定的文本)上添加注释 现在我面临一个问题,那就是获取文本和最佳方式。如果有人能给我一些线索,我会很感激的 我尝试了pdftohtml,但输出看起来不像是真正复杂的原始文档()。即使这一个也不能真正反映

在我的项目中,我必须用HTML5/CSS3做一个PDF查看器,应用程序必须允许用户添加注释和注释。事实上,我必须做一些与crocodoc.com非常相似的事情

起初,我想从PDF中创建图像,并允许用户创建区域并向该区域发布评论。不幸的是,客户端还希望在此PDF中导航,并仅在允许的部分(例如,段落或选定的文本)上添加注释

现在我面临一个问题,那就是获取文本和最佳方式。如果有人能给我一些线索,我会很感激的

我尝试了
pdftohtml
,但输出看起来不像是真正复杂的原始文档()。即使这一个也不能真正反映输出,但比pdftohtml好得多


我对任何解决方案都持开放态度,尤其是linux下的命令行

这是一项艰巨的任务


要阅读PDF中的文本,请查看提案代码。

还有一个非常广泛的文档,它还允许加载和解析PDF文档。PDF的各种元素可以迭代,因此也可以转换为HTML5或任何您喜欢的内容。您甚至可以将网站上的符号嵌入PDF,反之亦然


尽管如此,你仍然没有得到简单的任务。祝你好运。

我和你走的是同一条路,还有更复杂的任务

在尝试了所有东西之后,我最终在iTextSharp上使用了Mono下的C#(因此它在linux上运行)

即使有一个非常完整的库(如iTextSharp),有些任务也需要进行反复试验:)

从页面中提取文本很容易(请查看下面的snipper),但是如果您打算保留文本坐标、字体和大小,您将有更多的工作要做

int pdf_page = 5;
string page_text = "";

PdfReader reader = new PdfReader("path/to/pdf/file.pdf");
PRTokeniser token = new PRTokeniser(reader.GetPageContent(pdf_page));
while(token.NextToken())
{
    if(token.TokenType == PRTokeniser.TokType.STRING)
    {
        page_text += token.StringValue;
    }
    else if(token.StringValue == "Tj")
    {
        page_text += " ";
    }
}
对所有令牌执行
Console.WriteLine(token.StringValue)
,查看PDF中文本段落的结构。通过这种方式,您可以检测坐标、字体、字体大小等

添加:

鉴于您需要完成的任务,我有一个建议:

使用坐标、字体系列和大小提取文本-关于每个段落的所有信息。然后,将PDF格式转换为图像,并在您的在线查看器中,根据需要在图像上的段落上应用不可见的可选文本


通过这种方式,您的用户可以在需要的地方选择文本的一部分,而无需在html中重新构建整个PDF:)

pdftk是一个非常好的工具,可以这样做(我不知道它是否能够完全完成此任务)


我最近研究并发现了一个本地PHP解决方案,可以使用FOSS实现这一点。PHP类可用于导入PDF文档以与或PHP类一起使用,这两个类都提供创建、读取、更新和写入PDF文档的功能。就个人而言,我更喜欢它,因为它提供了更大的功能集(vs.)、更丰富的API(vs.)、更多的使用示例(vs.)和更活跃的社区论坛(vs.)

选择前面提到的一个类或另一个类,以编程方式处理PDF文档。关注当前和未来可能的交付成果,以及期望的用户体验,决定在何处(例如服务器-PHP、客户端-JavaScript,两者)以及交互逻辑的实现程度(功能驱动)

就我个人而言,我将使用通过FPDI导入PDF文档而获得的TCPDF实例来迭代检查、转换为通用格式(XML、JSON等),并将结果表示存储在关系表中,这些关系表旨在持久化与所需文档层次结构和细节级别相关的数据。必要的详细程度通常取决于规范文件及其对当前和未来可能交付成果的提及

注意:在这种情况下,我强烈建议翻译文档并以通用格式存储,以创建一个抽象层和透明层。例如,一个可能的和不可预见的未来交付可能是为上传Microsoft Word文档的用户提供相同的应用程序功能。如果上传的MicrosoftWord文档没有翻译并以通用格式存储,那么几乎肯定需要更新Web服务API和相关的业务逻辑。这最终会导致在设计、开发和支持多个翻译人员时存储臃肿、次优的数据,并且开发资源的使用效率低下。与只将入站数据转换为最佳格式一次相比,将服务器资源转换为每个请求的出站数据也是一种低效的使用方式

然后,我将通过设计和关联用于持久化特定于功能的文档资产数据的附加表来扩展基本文档表,例如:

版本化的添加/编辑/删除

  • 什么
    • 页眉/页脚
    • 文本
      • 原值
      • 新价值
    • 图像
      • 页码(一页、多页或全部)
      • 位置(相对-文本锚定,绝对-x/y坐标)
      • 文件(相对或绝对目录或url)
    • 画笔(图纸)
      • 页码(一页、多页或全部)
      • 位置(相对-文本锚定,绝对-x/y坐标)
      • 形状(重新绘制直线、正方形、圆形、用户定义的x/y坐标等)
      • 类型(钢笔、铅笔、记号笔等)
      • 重量(1px、3px、5px等)
      • 颜色
    • 注释
      • 页面
      • 位置(相对-文本锚定,绝对-x/y坐标)
      • 形状(直线、正方形、圆形、用户定义等)
      • 值(注释文本)