使用 C 不正确的 PDF 文件复制
Improper PDF file copy using C
我用 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 编写了一个代码,其中我将 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);
}