使用C进行不正确的PDF文件复制

时间:2016-07-19 06:44:22

标签: c pdf mupdf file-copying

我在C中编写了一个代码,其中我将PDF文件的内容从一个位置复制到另一个位置以进行进一步处理。我做的是:

以二进制读取模式打开文件

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文件时,它没有错误。

请随时询问您想要的任何其他信息。

1 个答案:

答案 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);
}