用于阅读doc,docx,pdf的C程序

时间:2015-05-06 03:04:35

标签: c pdf docx doc

我想用C语言编写一个程序(只有c而不是c ++或java),它将读取doc,docx,pdf并希望在github上使用它以供所有需要该代码的人使用。所以我开始使用.doc文件,我探索过,如果我用简单的记事本打开.doc文件,它会显示所有文本,但只是一些额外的内容,你可以轻松修剪。所以我写了一个简单的c程序来读取'r'和'rb'模式下的.doc wile但是这两次它只给我5-9个字符的文件和那些也不可读。我不知道为什么会这样。任何评论或讨论对我都非常有帮助。

以下是github Source code的链接。请帮我完成所有三种格式。

3 个答案:

答案 0 :(得分:2)

要回答您的具体问题,您的小应用程序停止阅读的原因是因为它错误地认为您的文件中有EOF个字符。

看看你的代码:

char ch;
int nol=0, not=0, nob=0, noc=0;
FILE *fp;
fp = fopen("file.doc","rb");
while(1)
{
    ch = fgetc(fp);
    if(ch==EOF)
    {
        break;
    }

fgetc(fp)的结果存储在char类型的变量中,该变量是单字节变量。但是,fgetc的结果非常有目的地是“int”,而不是“char”。

fgetc总是返回0到255范围内的正结果,除非到达文件末尾,在这种情况下返回EOF,这通常实现为-1值

如果读取值为255的字节并将其存储在int中,则一切正常,它将存储为值255并且您的循环可以继续。如果将结果存储在char中,它将被解释为等于EOF。你的循环停止了。

答案 1 :(得分:0)

.doc文件类型视为txt文件,但在您的内容之前,中间和之后都有额外的不可打印字符。这些不可打印的字符用于定义特殊格式,元数据和其他信息。

有了这个说法,所有.doc个文件都遵循某种结构。

如果在十六进制编辑器中打开两个不同的.doc文件,您会注意到两个文件的文本内容都从文件开头的0xA00(2560字节)偏移量开始。这意味着当您最初打开文件时,可以忽略文件的前2560个字节(请查看fseek()函数)。

从现在开始,您可以阅读文件内容,直至到达'\0'

我还没有看到.pdf.docx文件的实现,但您可以使用十六进制编辑器打开这两个文件并找出可以使用哪种模式隔离重要内容的文件。

希望这有帮助。

编辑:您始终可以找到有关您要操作的不同文件格式的文档。以下是PDF文件类型的规范:

http://www.adobe.com/devnet/pdf/pdf_reference.html http://wwwimages.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/PDF32000_2008.pdf

答案 2 :(得分:0)

不要期望随便找到这个想法。 .doc是一种巨大的二进制文件格式,解析起来非常复杂。话虽如此,Cubia提到了文件的文本部分开始的偏移量。我不熟悉格式的详细信息,但如果原始文本包含在一个位置,请使用fseek来获取它并在到达结尾时停止。其他格式的情况并非如此,因为它们非常不同。

.docx和.pdf应该更容易解析,因为它们是更现代的格式。如果你想从docx读取任何内容,你需要从一个包含大量xml的zip文件中读取,并使用解析器来确定你想要的文本。

.pdf应该是三者中最容易的,因为你可以在那里找到几乎可以做你想要的库。

至于为什么你从程序中得到奇怪的输出,请记住.doc是一种二进制格式,绝大多数数据都是垃圾。将它转储到终端将产生可读的文本,但也会产生一堆控制字符,这些字符应该与您的终端有关。

作为最后一点 - 请勿尝试使用fread直接阅读docx文件 - 它们会被压缩,因此您可能无法恢复未修改的文本。看一下libarchive。此外 - 期望必须阅读文档规范。 docx似乎是openoffice格式的微软扩展。请参阅Error Handing in SQL Server 2012和一些PDF规范文档(有多个版本)。