c - 使用 C 不正确的 PDF 文件复制

标签 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 文件时,它没有给出任何错误。

请随时询问您需要的任何进一步信息。

最佳答案

问题出在这里:

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

关于c - 使用 C 不正确的 PDF 文件复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38451264/

相关文章:

c - 是否可以将这种无锁的 32 位哈希表算法用于 64 位 key ?

php - 上传 PDF 文件 PHP

android - Android 上的 Mupdf 内存泄漏

android - 使用 MuPDF 像翻转板一样水平翻转

javascript - 运行 mutool run script.js 时未定义“argv”

c - 在 C 中分配二维数组的更好做法是什么

c - 逻辑程序: increment and arithmetic operator of C

c - 为什么我的简单 C 宏不起作用?

java - 使用 itext 将签名应用于 pdf 后出现 "The document has been altered or corrupted since the signature was applied"错误

java - 使用 java 创建 jpeg(或 pdf)图形/图表的可用方法/资源有哪些