2016-07-19 37 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); 
}