Определите, правильный ли PDF-файл (заголовок PDF) [закрыт]

У меня есть приложение Windows .NET, которое управляет многими PDF-файлами. Некоторые файлы повреждены.

2 проблемы: я попытаюсь объяснить на моем худшем английском языке...жаль

1.)

Как я могу определить, правильный ли файл pdf ?

Я хочу прочитать заголовок PDF и определить правильно.

var okPDF = PDFCorrect (@"C:temppdfile1 - ... pdf");

2.)

Как узнать, является ли байт [] (bytearray) файла PDF файл или нет.

например, для ZIP-файлов вы можете изучить первые четыре байта и посмотреть, соответствуют ли они локальной подписи заголовка, т. е. в hex

50 4Б 03 04

if (buffer[0] == 0x50 & & buffer[1] = = = 0x4b & & buffer[2] == 0x03 && буфер[3] == 0x04)

Если вы загружаете его в длинный, это (0x04034b50). Дэвид Пирсон

Я хочу то же самое для PDF-файлов.

байт[] dataPDF = ...

var okPDF = PDFCorrect (dataPDF);

любой пример исходного кода в .NET?

7 ответов


1) к сожалению, нет простого способа определить, поврежден ли файл pdf. Обычно файлы проблем имеют правильный заголовок, поэтому реальные причины коррупции отличаются. PDF-файл-это фактически дамп объектов PDF. Файл содержит справочную таблицу, содержащую точные местоположения смещения байтов каждого объекта с начала файла. Поэтому, скорее всего, поврежденные файлы имеют сломанные смещения или могут быть пропущены некоторые объекты.

лучший способ определить, что файл повреждено использовать специализированные библиотеки PDF. Таких библиотек много как бесплатных, так и коммерческих .Сеть. Вы можете просто попытаться загрузить PDF-файл с одной из таких библиотек. iTextSharp будет хорошим выбором.

2) в соответствии со ссылкой на PDF заголовок файла PDF обычно имеет форму %PDF-1.X (где X-число, в настоящее время от 0 до 7). И 99% PDF-файлов имеют такой заголовок. Но также есть некоторые другие виды заголовков, которые Acrobat Viewer принимает и даже отсутствие заголовка не является реальной проблемой для просмотра PDF. Поэтому вы не должны рассматривать файл как поврежденный, если у него нет заголовка. Е. Г. заголовок может быть появились где-то в пределах первых 1024 байтах файла или в виде %!ПС-Саман-н. н. в формате PDF-М. М

просто для вашей информации я разработчик Docotic PDF library.


Я проверяю заголовок 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-файла-это заголовок, определяющий версию спецификации PDF которому соответствует файл %PDF-1.0, %PDF-1.1, %PDF-1.2, %PDF-1.3, %PDF-1.4 etc.

вы можете проверить это, прочитав некоторые байты с начала файла и посмотреть, есть ли у вас заголовок в начале для соответствия как PDF-файл. Вижу PDF reference от Adobe для получения более подробной информации.

у вас нет примера .NET для вас (не трогали вещь в некоторых но даже если бы я это сделал, я не уверен, что вы можете проверить полное действительное содержимое файла. Заголовок может быть в порядке, но остальная часть файла может быть испорчена (как вы сами сказали, некоторые файлы повреждены).


хорошие PDF-файлы начинаются с первых 9 байтов как %PDF-1.x плюс новая строка (где x в 0..8). 1.x должен дать вам версию формата файла PDF. 2-я строка - это некоторые двоичные байты, чтобы помочь приложениям (редакторам) идентифицировать PDF как тип файла без ASCIItext.

однако вы не можете доверять этому тегу вообще. Есть много приложений, которые используют функции из PDF-1.7, но утверждают, что PDF-1.4 и таким образом вводят в заблуждение некоторых зрителей в выплевывание недопустимых сообщений об ошибках. (Скорее всего, эти PDF-файлы являются результатом неправильного преобразования файла из более высокой в более низкую версию PDF.)

в PDF нет такого раздела, как "заголовок" (возможно, начальные 9 байтов %PDF-1.x вы имеете в виду"заголовок"?). Там может быть встроена структура для хранения метаданных внутри PDF, давая вам информацию об авторе, CreationDate, ModDate, название и некоторые другие вещи.

мой путь надежно проверить для Формат PDF коррупции

нет другого способа проверить правильность и неповрежденность PDF-файла, кроме как отобразить его.

"дешевый" и довольно надежный способ проверить такую действительность для меня лично-использовать Ghostscript.

: вы хотите, чтобы это произошло быстро и автоматически. И вы хотите использовать метод программно или с помощью скриптового подхода для проверки многих 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 не будет выводить результат рендеринга. Но все выходные данные stderr и stdout Ghostscript обрабатывают входные данные.pdf будет по-прежнему отображается в консоли. -r36x36 устанавливает разрешение 36 dpi для ускорения проверки.

%errorlevel% (или $? на Linux) будет 0 для неповрежденного файла. Это будет не0 для поврежденных файлов. И любые предупреждения или сообщения об ошибках, появляющиеся на stdout, могут помочь вам определить проблемы с вводом.документ pdf.

нет другого способа проверить повреждение файла PDF, чем каким-то образом отобразить его...


можно использовать iTextSharp чтобы открыть и попытаться проанализировать файл (например, попытаться извлечь из него текст), но это, вероятно, излишне. Вы также должны знать, что это GNU Affero GPL Если вы покупаете коммерческую лицензию.


проверка заголовка сложно. Некоторые из вышеприведенных кодов просто не будут работать, так как не все PDF начинаются с %PDF. Некоторые pdf-файлы, которые правильно открываются в средстве просмотра, начинаются с маркера спецификации, другие начинаются так

------------e56a47d13b73819f84d36ee6a94183 Content-Disposition: form-data; name= " par" ...и т. д.

поэтому проверка "%PDF " не будет работать.


Что я делаю:

1.Проверить расширение

2.Откройте PDF-файл, прочитайте заголовок (первую строку) и проверьте, содержит ли он эту строку: "%PDF-"

3.Проверьте, содержит ли файл строку, указывающую количество страниц, путем поиска нескольких "/ Page " (файл PDF всегда должен иметь не менее 1 страницы)

как предлагалось ранее, вы также можете использовать библиотеку для чтения файла: чтение PDF-файла с помощью iTextSharp