微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从C语言的PDF文件中读取字符串?

如何解决如何从C语言的PDF文件中读取字符串?

我想创建一个程序来处理两个文件间的编辑距离,我的代码适用于从txt文件读取的字符串。但是现在我想从PDF DOC exc中读取字符串。如何从此文件读取字符串?我尝试使用func fread,但是它不起作用。 这是我写的代码

void method () {
FILE *file;
char *str;
if ((file = fopen("C:/Users/latin/Desktop/prova.pdf","rb")) == NULL) {
    printf("Error!\n");
}
fread(&str,18,1,file);
printf("%s",str);
}

prova.pdf 一个包含以下字符串的PDF文件 CiaoCiao merendina

解决方法

可以在纯C语言中执行此操作。Adobe做到了。 Artifex做到了。其他人已经做到了。但正如所评论的,这是大量的工作。但我可以概述一些步骤,以使您对所涉及的事情有一个感觉。

首先,您可以从头开始阅读“ Magic Number”,并检查它实际上是否为PDF。它应以%PDF-开头,后跟版本号。但是显然许多PDF生产者都不符合此要求。

下一步,您需要跳到文件的最后并向后读,寻找类似的内容:

startxref
1581
%%EOF

该数字是X-Reference表开头的字节偏移量,该表列出了文件中所有“对象”的二进制偏移量。对象可以是页面,字体或内容流,也可以是许多其他东西。

查看X-Reference表,您将看到类似这样的内容:

xref
0 4
0000000000 65535 f 
0000000010 00000 n 
0000000063 00000 n 
0000000127 00000 n 
0000000234 00000 n 
trailer
<<
  /Root 1 0 R
  /Size 4
>>

/Root 1 0 R行告诉您哪个对象是文档树的根。您需要检查该对象以找到如下所示的顶级Pages对象:

2 0 obj
<< /Kids [ 3 0 R ] 
/Type /Pages 
/Count 1 
>> 
endobj

此处的Kids元素包含对第一个Page对象的引用,如下所示:

3 0 obj
<< /Contents [ 4 0 R ] 
/MediaBox [ 0.0 0.0 612.0 792.0 ] 
/Type /Page 
/Parent 2 0 R 
>> 
endobj

然后,您需要找到这里引用的Contents对象。内容流(如果未加密或压缩)将向您显示在页面上绘制的绘图命令和文本命令。

5 0 obj
<<
  /Length 15660 
>>
stream
BT F1 10.0 Tf 30.0 750.0 Td (<< ) Tj ET BT F1 10.0 Tf 50.0 738.0 Td (/) 
Tj ET BT F1 10.0 Tf 56.0586 738.0 Td (astring) Tj ET BT F1 10.0 Tf 86.7852 
738.0 Td ( ) Tj ET BT F1 10.0 Tf 89.2852 738.0 Td (\() Tj ET BT F1 10.0 Tf 
92.6133 738.0 Td (this string data) Tj ET 
[...lots more commands follow...]
endstream
endobj

文本命令将始终用BT ... ET括起来。在这里,您最终可以看到包裹在括号中的字符串。但是您必须注意每个字符串的坐标30.0 750.0 Td才能确定哪些是同一逻辑行的一部分。

如果PDF是通过文字处理程序创建的,则很可能以这种形式包含文本,但有很多警告。它可能具有重新编码的字体,并且文本字符串将不再表示ASCII字符,而仅表示字体的编码矢量中的位置。如果PDF是根据扫描的文档创建的,则除非经过了涉及OCR的转换,否则它可能只包含根本没有文本内容的页面图像。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。