怎么检测PDF文件是不是损坏

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么检测PDF文件是不是损坏相关的知识,希望对你有一定的参考价值。

有大量的PDF文件,怎么才能检测出哪些PDF文件是损坏的

参考技术A 请安装Adobe Acrobat XI Pro软件,用它打开PDF文档,能打开的是好的,不能打开的是损坏的。追问

可是有十几万个文件呢,总不能一个一个点开

参考技术B 同问,有没有好办法?

iTextSharp + FileStream = 损坏的 PDF 文件

【中文标题】iTextSharp + FileStream = 损坏的 PDF 文件【英文标题】:iTextSharp + FileStream = Corrupt PDF file 【发布时间】:2011-01-12 07:26:15 【问题描述】:

我正在尝试使用 iTextSharp 创建一个 pdf 文件。我的尝试将 pdf 的内容写入 MemoryStream,这样我就可以将结果写入文件和数据库 BLOB。该文件被创建,大小约为 21kB,使用 Notepad++ 打开时看起来像 pdf。但我的 PDF 查看器说它已损坏。 这是一段小代码 sn-p(只尝试写入文件,而不是写入数据库):

Document myDocument = new Document();
MemoryStream myMemoryStream = new MemoryStream();
PdfWriter myPDFWriter = PdfWriter.GetInstance(myDocument, myMemoryStream);
myDocument.Open();
// Content of the pdf gets inserted here
using (FileStream fs = File.Create("D:\\...\\aTestFile.pdf"))

    myMemoryStream.WriteTo(fs);

myMemoryStream.Close();

我的错误在哪里?

谢谢, 诺伯特

【问题讨论】:

你需要那个 MemoryStream 吗?您在写入 FileStream 之前关闭了该 myDocument 吗? 【参考方案1】:

我认为您的问题是您没有正确地将内容添加到您的 PDF。这是通过 Document.Add() 方法完成的,您可以通过调用 Document.Close() 来完成。

但是,当您调用 Document.Close() 时,您的 MemoryStream 也会关闭,因此您将无法将其写入您的 FileStream。您可以通过将 MemoryStream 的内容存储到字节数组来解决此问题。

以下代码 sn-p 对我有用:

using (MemoryStream myMemoryStream = new MemoryStream()) 
    Document myDocument = new Document();
    PdfWriter myPDFWriter = PdfWriter.GetInstance(myDocument, myMemoryStream);

    myDocument.Open();

    // Add to content to your PDF here...
    myDocument.Add(new Paragraph("I hope this works for you."));

    // We're done adding stuff to our PDF.
    myDocument.Close();

    byte[] content = myMemoryStream.ToArray();

    // Write out PDF from memory stream.
    using (FileStream fs = File.Create("aTestFile.pdf")) 
        fs.Write(content, 0, (int)content.Length);
    

【讨论】:

【参考方案2】:

我有类似的问题。我的文件已下载,但文件大小为 13 字节。当我使用二进制编写器写入文件时,我解决了这个问题

byte[] bytes = new byte[0];
//pass in your API response into the bytes initialized

using (StreamWriter streamWriter = new StreamWriter(FilePath, true))

   BinaryWriter binaryWriter = new BinaryWriter(streamWriter.BaseStream);
   binaryWriter.Write(bytes);

【讨论】:

这个答案可以通过解释为什么这可以解决问题以及错误是什么来改进。【参考方案3】:

只是一些想法 - 如果用文件流替换内存流会发生什么?这是否为您提供所需的结果?这至少会告诉你问题可能出在哪里。

如果这确实有效,文件有何不同(大小和二进制表示)?

只是猜测,但您是否尝试过在写入之前寻找内存流的开头?

myMemoryStream.Seek(0, SeekOrigin.Begin);

【讨论】:

以下也不起作用:Document myDocument = new Document(); PdfWriter myPDFWriter = PdfWriter.GetInstance(myDocument, new FileStream(path, FileMode.Create)); myDocument.Open(); // Content ... myDocument.Close();损坏的文件... :(【参考方案4】:

尝试仔细检查您使用 iText 操作 PDF 的代码。确保调用任何 PdfContentByte 对象的适当 EndText 方法,并确保在将文件写入磁盘之前调用 myDocument.Close()。这些是我过去在使用 iTextSharp 生成 PDF 时遇到的问题。

【讨论】:

【参考方案5】:
documentobject.Close();
using (FileStream fs = System.IO.File.Create(path))                        
    Memorystreamobject.WriteTo(fs);
         

【讨论】:

以上是关于怎么检测PDF文件是不是损坏的主要内容,如果未能解决你的问题,请参考以下文章

如何检测pdf文档是不是有损坏

怎么样快捷判断WORD\EXCEL\PDF\图片等文件,是不是已经损坏,或者判断文件是不是完好。

PDF下载无法打开

java 下载pdf文件损坏

怎样把PDF文件在WinForm窗口中显示出来

用Office如何导出高质量的PDF文件?