2016-07-19 41 views
0

我已经在C中编写了一个代码,其中我将PDF文件的内容从一个位置复制到另一个位置以供进一步处理。我所做的是:不正确的PDF文件使用C复制使用C

打开二进制读模式文件

if ((fp = fopen(argv[6],"rb")) == 0) { 
     fprintf(stderr, "ERROR: Can't open input file %s\n",argv[6]); 
     goto out; 
} 

然后我的PDF文件的内容保存到一个临时位置

/* save the contents for the file to a temporary location */ 
    tempfp = fopen(CUPS_IPTEMPFILE, "wb"); 
    while ((n = fread(buf, 1, BUFSIZ, fp)) > 0) { 
    count = fwrite(buf, 1, BUFSIZ, tempfp); 
    } 
    fclose(tempfp); 

我使用MuPDF打开文件;虽然MuPDF是能够正确显示的文件,它提供了在终端上出现以下错误:

$ mupdf cupsiptempfile.pdf 
error: cannot find startxref 
warning: trying to repair broken xref 

如果我使用Okular中显示相同的文件,我没有得到任何错误

$ okular cupsiptempfile.pdf 
okular(12821)/kdecore (KConfigSkeleton) KCoreConfigSkeleton::writeConfig: 
okular(12821)/kdecore (KConfigSkeleton) KCoreConfigSkeleton::writeConfig: 
okular(12821)/kdecore (KConfigSkeleton) KCoreConfigSkeleton::writeConfig: 
okular(12821)/kdecore (KConfigSkeleton) KCoreConfigSkeleton::writeConfig: 
okular(12821)/kdecore (KConfigSkeleton) KCoreConfigSkeleton::writeConfig: 

为什么这里有区别吗?我在复制部分做错了什么?

附加信息:当我使用MuPDF打开原始PDF文件时,它没有出现错误。

请随时询问你想要的任何进一步的信息。

+3

当你复制你写BUFSIZ字符,但你可能没有读BUFSIZ字符 - 变量n没有告诉你有多少个字符中读取所以这是你应该有多少写。 –

+0

@JerryJeremiah是的,你是对的。这解决了问题。傻我,我没注意到那个。 – Pranjal

+0

很高兴帮助。 –

回答

2

的问题是在这里:

while ((n = fread(buf, 1, BUFSIZ, fp)) > 0) { 
    count = fwrite(buf, 1, BUFSIZ, tempfp); 
} 

当您将文件复制你写BUFSIZ字符了,但你可能没有读BUFSIZ字符 - 变量n那里告诉你有多少个字符是如何读这么你应该只写出那些n个字符。这大概应该是这样的:

while ((n = fread(buf, 1, BUFSIZ, fp)) > 0) { 
    count = fwrite(buf, 1, n, tempfp); 
}