Acrobat Reader在读取文档时出现错误,可能已损坏且无法修复

时间:2019-04-02 11:48:13

标签: pdf pdfbox acrobat

我无法在acrobat Reader上打开this pdf file,它告诉我错误(法语),而没有代码错误。当在Acrobat Reader中打开opne pdf文件时,如何获取有关错误警报的更多信息,是否有捷径显示有关错误的更多信息,因为当前仅以法语显示:

  

“读取文档时发生错误,它可能已被纠正并且无法   修复”

在chrome pdf查看器中,我可以打开此error-original.pdf

PS:这是另一个ok-original.pdf,在使用acrobat阅读器打开时可以使用。

Windows 10上的Im,acrobat Reader版本:19.10.20098.316574

我无法解释为什么我的文件error-original.pdf可能由于pdfbox的某些操作而损坏,但无法复制。我的问题是如何获取有关此错误的更多错误信息。

更新#1(更多信息)

这是我用来准备/操作原件的代码.pdf 此代码执行4件事: 1.设置字段的partialName(与当前字段值相同) 2.删除页面中的所有链接 3.删除带有空||空白值的字段 4.使用@mkl方法OptimizeAfterMerge.java

进行临时压缩以尝试偶然获取一些八位位组
Document pdfOriginal = PDDocument.load(f.toFile());

//1.set field partialName like his current value
pdfOriginal.getDocumentCatalog().getAcroForm().getFields().forEach(field -> {
    if (field instanceof PDTextField && !field.getValueAsString().contains("--")
            && !field.getValueAsString().isBlank() && !field.getValueAsString().isEmpty()) {
        field.setPartialName(field.getValueAsString());
    }
});

//2.remove all link in document
removeLinksInPages(pdfOriginal);

//3.remove field with empty||blank value
pdfOriginal.getDocumentCatalog().getAcroForm().getFields().forEach(field -> {
    if (field instanceof PDTextField
            && (field.getValueAsString().isBlank() || field.getValueAsString().isEmpty())) {
        try {
            removeField(pdfOriginal, field.getPartialName());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
});

pdfOriginal.save(new File(f.toAbsolutePath().toString()));
pdfOriginal.close();

//4.try to compress to gain some octets
PDDocument compress = PDDocument.load(f.toFile());
OptimizePdfDocument.optimize(compress);
compress.save(new File(f.toAbsolutePath().toString()));
compress.close();

使用的方法:

removeLinksInPages(...)

removeField(...)

我无法确认此代码始终输出正确的文件,因为它不会,但是有时如果我使用acrobat Reader打开文件,则无法读取。

(发送给@mkl的消息:相信我,我在这里没有告诉您方法损坏的文件之一,并且我知道您的压缩是针对合并文件的,请不要担心,我当然以错误的方式做事并尝试查找问题,感谢您的理解)

更新#2(奇怪的结果)

我遇到了奇怪的事情:仅在the above corrupted file error-original.pdf上运行此pdfbox代码:

PDDocument pdfOriginal = PDDocument.load(new File(".../error-original.pdf"));
pdfOriginal.save(new File(".../error-original.pdf"));
pdfOriginal.close();

Acrobat Reader能够打开输出(未修改的pdf文件),但是当您滚动acrobat Reader时,出现另一个错误:“此页面有错误,acrobat reader无法显示此页面。请与pdf作者联系以解决问题”以及当我关闭error-alert-popup,我可以继续滚动并阅读pdf。 您可以尝试使用Acrobat Reader打开此error-on-scroll.pdf

ps:发给@acrobatreader的消息:问题是我是PDF作者,我不知道如何解决(笑话)

@KenS,请您为此提供一些输入,看来错误在第2页上

3 个答案:

答案 0 :(得分:1)

当Acrobat显示错误时,您可以尝试按住Control键(在Windows上),同时单击“确定”按钮。有时这可以为您提供更多信息。

在这种情况下不是。文件严重损坏。它已经被编辑了至少两次,并且编辑看起来已经破坏了文件,无法简单修复。该文件包含:

startxref
81612

,它应该指向外部参照表的开始(其中包含所有对象在文件中的偏移量)。而是文件偏移指向:

C89E1E8B69>]/Index[4 2 10 1 156 2]/Info 5 0 R/Length 31/Prev 77185/Root 1 0 R/Size 158/Type/XRef/W[1 3 0]>>stream

这是交叉引用流中的一部分。尾部字典包含一个/ Prev条目,该条目应指向先前的外部参照,相反,它再次指向外部参照流的特定用法。更正该错误之后,它指向预告字典,该预告字典又有一个/ Prev条目不正确。

无论您使用什么来编辑此文件,它都以相同的方式不断破坏它。

我可以修复这些偏移,这使Ghostscript可以打开和读取文件(MuPDF甚至可以修复原始文件)。它仍然抱怨外部参照无效,并尝试修复。在修复过程中,发现某些PDF对象具有相同的对象编号和世代编号,而事实并非如此。

由于Acrobat无法打开已修复的文件,因此可能也是Acrobat抱怨的。似乎文件的两次编辑都包含了对象4、5和10的新定义,但是没有增加它们的世代编号,使它们保持为0,因此彼此重复。

从根本上讲,如果Acrobat无法打开您的文件,则应将其视为完全损坏。

答案 1 :(得分:0)

Ken's answer ...

的推论

文件中存在三个修订版本(即,文件具有初始版本和两个增量更新)。由于您的PDFBox代码仅保存为全新文件,而不使用增量更新,因此PDFBox代码的最终结果已经在该第一修订版中。

此外,原始文件“ ok-original.pdf”是使用交叉引用表保存的,而结果文件中的所有修订版仅使用交叉引用流。

由于您的PDFBox代码使用与加载文件时相同的交叉引用技术来保存文件(默认为PDFBox),这意味着即使第一个修订版也不是PDFBox的立即输出,而是其他人再次加载和存储的输出程序,可能是Adobe Acrobat,从而改变了这项技术。

因此,您甚至在初始版本中都看不到确切的PDFBox输出,而只能看到下一个程序的输出。因此,特别是PDFBox不负责在交叉引用流中构建交叉引用偏移量,也不负责这些交叉引用流本身的偏移量。

正如KenS在他的回答中所解释的, startxref Prev 条目中交叉引用流对象的偏移太大;更确切地说,对于初版而言,它们太大了,对于第二版来说,它们太大了,对于第二版来说,它们太大了,对于第二版来说,它们太大了,对于第二版来说,它们的大小对于整个PDF来说,太大了131。

PDFBox(参见上文)尚未创建这些交叉引用流,更不用说它们的偏移值了。因此,您的PDFBox代码不对错误的偏移量负责!

如果Adobe Acrobat是生成了这三个修订的程序,我也将怀疑Adobe Acrobat造成了错误的偏移量。

在我看来,之后文件已被某个程序复制或传输,或者通过某个通道从文件中删除了一些字节,第一个修订版中为116个字节,第二个版本中为6个字节,第三个版本中为9个字节,

(这种下降也可能是由于多个字节合并为更少的字节而导致的...)

答案 2 :(得分:0)

也许<?php $_COOKIE['PageNo'] = 3; ?> 的pdf除 <?php session_start(); require "includes/dbh.inc.php"; ?> <?php echo $_COOKIE['PageNo']; //$_COOKIE['PageNo'] = 5; //Commented out, for testing if (!isset($_COOKIE['PageNo'])){ setcookie("PageNo", 1, time() + (86400 * 30), "/"); // 86400 = 1 day, so set the cookie for a month long period } ?> <!doctype html> <html lang="en" prefix="og: http://ogp.me/ns#"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>iStudy University | Stress & Anxiety</title> <link rel="stylesheet" type='text/css' media='all' href="webslides.css" rel="stylesheet"> <body> <script src="static/js/webslides.js"></script> <!-- BEGINNING OF SLIDES --> <?php if($_COOKIE['PageNo'] >= 2) { ?> <script> window.location.replace("<?php echo "istudy_university.php#slide=".$_COOKIE['PageNo']; ?> "); </script> <?php } else { ?> <script> window.location.replace("istudy_university.php#slide=1"); </script> <?php } ?> <main role="main"> <article id="webslides"> <!-- SLIDE 1 --> <section class="bg-apple aligncenter"> <span class="background dark" style="background-image: url('istudy_slides_images/abstract.jpg')"/></span> <div class="wrap" id="slide=1"> <h1 class="text-landing">Stress & Anxiety</h1> <br> <br> <br> <hr id="hor-rule"> <h1 class="slides-logo">iStudy University <i class="fas fa-graduation-cap"></i></h1> <h2 class="slogan">Designed by Students <br><span class="iv">IV</span> <br>Students</h2><br><br> </div> </section> <!-- SLIDE 2 --> <?php $_COOKIE['PageNo'] = 2; ?> <section class="aligncenter"> <span class="background light" style="background-image: url('istudy_slides_images/mountain.jpg')"/></span> <div class="wrap" id="slide=2"> <blockquote class="quote"> <p class>"No one can create negativity or stress within you. Only you can do that by virtue of how you process your world"</p> <p><cite>Wayne Dyer</cite></p> </blockquote> </div> </section> <!-- SLIDE 3 --> <?php $_COOKIE['PageNo'] = 3; ?> <section class="bg-slide3"> <div class="wrap size-80" id="slide=3"> <h3 class="title stessAnx"><strong>&ensp;Stress & Anxiety</strong></h3><br> <p>Stress and anxiety are common experiences of students in higher education.<br>This module will introduce you to evidence based techniques for managing stress and anxiety based upon cognitive behavioural therapy (CBT).</p> </section> </div> 之外还具有/ Prev

但我转载并找到解决方法: 这里的问题是GIT,在我的项目中,从远程获取文件时,好像将pdf文件像文本一样对待,而是二进制。仅添加内容为error-original.pdf的.gitattributes文件后,即可解决此问题。 因此,恢复:

  1. Pdf作者(在其本地计算机上)正在使用pdf。

  2. pdf作者commit +推送到远程。

  3. 另一个用户从远程拉出更改并尝试打开pdf:这导致“文件损坏”。

  4. 在.gitignore级别添加.gittattributes解决了问题。

PS:但是@mkl和Kens所说的所有事情也保持正确。