2016-07-19 6 views
0

Я написал код на C, где я копирую содержимое PDF-файла из одного места в другое для дальнейшей обработки. То, что я сделал это:Неправильная копия файла PDF с использованием 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: 

Почему здесь есть разница? Я что-то делаю с копией?

Дополнительная информация: Когда я открываю исходный файл PDF с помощью MuPDF, он не дает ошибки.

Пожалуйста, задавайте любые интересующие вас вопросы.

+3

При копировании вы пишете символы BUFSIZ, но вы не можете прочитать символы BUFSIZ - переменная п есть, чтобы сказать вам, сколько символов считывали так, что, сколько вы должны написать , –

+0

@JerryJeremiah Да, вы правы. Это решило проблему. Глупый я, я этого не заметил. – Pranjal

+0

Рад, что помогло. –

ответ

2

Проблема здесь:

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

При копировании файла записи символов BUFSIZ вне но вы не можете прочитать символы BUFSIZ в - переменная п есть, чтобы сказать вам, сколько символов считывали так вы должны только написать эти n символов. Это, вероятно, следует выглядеть следующим образом:

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