C# 检测PDF文件是否正确(页眉PDF)

C# 检测PDF文件是否正确(页眉PDF),c#,file,pdf,header,corrupt,C#,File,Pdf,Header,Corrupt,我有一个管理许多PDF文件的windows.NET应用程序。有些文件已损坏 2个问题:我会试着用我不完美的英语解释…对不起 1.) 如何检测任何pdf文件是否正确 我想读取PDF的标题并检测它是否正确 var okPDF=PDFCorrect(@“C:\temp\pdfile1.pdf”) (二) 如何知道文件的字节[](bytearray)是否为PDF文件 例如,对于ZIP文件,您可以检查前四个字节,看看它们是否与本地头签名匹配,即十六进制 50 4b 03 04 如果(缓冲区[0]==0x5

我有一个管理许多PDF文件的windows.NET应用程序。有些文件已损坏

2个问题:我会试着用我不完美的英语解释…对不起

1.)

如何检测任何pdf文件是否正确

我想读取PDF的标题并检测它是否正确

var okPDF=PDFCorrect(@“C:\temp\pdfile1.pdf”)

(二)

如何知道文件的字节[](bytearray)是否为PDF文件

例如,对于ZIP文件,您可以检查前四个字节,看看它们是否与本地头签名匹配,即十六进制

50 4b 03 04

如果(缓冲区[0]==0x50&&buffer[1]==0x4b&&buffer[2]==0x03&& 缓冲区[3]==0x04)

如果要将其加载到long中,则为(0x04034b50)。大卫·皮尔森

我想要同样的PDF文件

字节[]数据PDF=

var-okPDF=PDFCorrect(dataPDF)


NET中的任何示例源代码?

PDF文件的第一行是标识PDF规范版本的标题 该文件与之一致的
%PDF-1.0
%PDF-1.1
%PDF-1.2
%PDF-1.3
%PDF-1.4

您可以通过读取文件开头的一些字节来检查这一点,并查看是否在开头有匹配为PDF文件的头。有关更多详细信息,请参阅Adobe提供的


没有一个.NET示例供您使用(已经有几年没有接触过这个东西了),但即使我有,我也不确定您是否可以检查该文件的完整有效内容。页眉可能没有问题,但文件的其余部分可能会混乱(正如您自己所说,有些文件已损坏)。

您可以使用打开并尝试解析文件(例如,尝试从中提取文本),但这可能有些过分。你还应该意识到,除非你购买了商业许可证,否则这是不可能的。不幸的是,没有简单的方法确定pdf文件是否损坏。通常,问题文件具有正确的头,因此损坏的真正原因是不同的。PDF文件实际上是PDF对象的转储。该文件包含一个参考表,该表给出了每个对象从文件开头的确切字节偏移位置。因此,很可能损坏的文件偏移量已损坏,或者丢失了某些对象

检测损坏文件的最佳方法是使用专门的PDF库。 NET有很多免费和商业PDF库。您可以简单地尝试使用其中一个库加载PDF文件。iTextSharp将是一个不错的选择

b。根据PDF参考,PDF文件的标题通常看起来像%PDF−1.X(其中X是一个数字,当前为0到7)。99%的PDF文件都有这样的标题。但是,Acrobat Viewer还接受其他类型的头,即使没有头,对PDF查看器来说也不是一个真正的问题。所以,若文件不包含头,则不应将其视为已损坏。 例如,头可能出现在文件的前1024个字节内的某个位置,或者以%的形式出现!附言−土砖−N.N PDF−M.M


仅供参考,我是的开发人员。

我检查PDF标题如下:

 public bool IsPDFHeader(string fileName)
    {
        byte[] buffer = null;
        FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
        BinaryReader br = new BinaryReader(fs);
        long numBytes = new FileInfo(fileName).Length;
        //buffer = br.ReadBytes((int)numBytes);
        buffer = br.ReadBytes(5);

        var enc = new ASCIIEncoding();
        var header = enc.GetString(buffer);

        //%PDF−1.0
        // If you are loading it into a long, this is (0x04034b50).
        if (buffer[0] == 0x25 && buffer[1] == 0x50
            && buffer[2] == 0x44 && buffer[3] == 0x46)
        {
            return header.StartsWith("%PDF-");
        }
        return false;

    }

性能良好的PDF从前9个字节开始,如
%PDF-1.x
加上一个换行符(其中x在0..8中)
1.x
应该会提供PDF文件格式的版本。第二行是一些二进制字节,以帮助应用程序(编辑器)将PDF识别为非ASCIItext文件类型

但是,您根本不能信任此标记。有很多应用程序使用PDF-1.7中的功能,但声称是PDF-1.4,因此误导了一些观众发出无效的错误消息。(最有可能的是,这些PDF文件是由于管理不当,将文件从较高的PDF版本转换为较低的PDF版本造成的。)

PDF中没有“header”这样的节(可能是
%PDF-1.x
的开头9个字节就是“header”的意思)。可能会在PDF中嵌入一个用于保存元数据的结构,为您提供有关作者、CreationDate、ModDate、标题和其他内容的信息

可靠检查PDF损坏的方法 除了呈现PDF,没有其他方法可以检查PDF的有效性和未损坏性

对于我个人来说,一种“便宜”且相当可靠的检查这种有效性的方法是使用

但是:您希望这种情况快速自动发生。您希望通过编程或脚本方法使用该方法来检查许多PDF

这里是诀窍:

  • 不要让Ghostscript将文件渲染到显示器或真实(图像)文件
  • 改用Ghostscript的
    nullpage
    设备
下面是一个命令行示例:

gswin32c.exe ^
    -o nul ^
    -sDEVICE=nullpage ^
    -r36x36 ^
    "c:/path to /input.pdf"
此示例适用于Windows;在Unix上使用
gs
而不是
gswin32c.exe
-o/dev/null

使用
-o nul-sDEVICE=nullpage
将不会输出任何渲染结果。但是Ghostscript处理input.pdf的所有stderr和stdout输出仍将出现在控制台中<代码>-r36x36将分辨率设置为36 dpi以加快检查速度

对于未损坏的文件,
%errorlevel%
(或Linux上的
$?
)将为
0
。对于损坏的文件,它将是非
0
。任何出现在标准输出上的警告或错误消息都可能帮助您识别input.pdf的问题

除了以某种方式呈现PDF文件外,没有其他方法可以检查PDF文件是否损坏


更新:同时,不仅%PDF-1.0、%PDF-1.1、%PDF-1.2、%PDF-1.3、%PDF-1.4、%PDF-1.5、%PDF-1.6、%PDF-1.7和%PDF-1.8是有效的版本指标,而且%PDF-2.0。我所做的是:

1.验证扩展

2.打开PDF文件,读取标题(第一行)并检查其是否包含以下字符串:“%PDF-”

3.通过搜索mul,检查文件是否包含指定页数的字符串