Подтвердить что ты не робот

Обнаружение, если файл PDF верен (заголовок PDF)

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

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

1.)

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

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

var okPDF = PDFCorrect (@"C:\temp\pdfile1.pdf");

2.)

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

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

50 4b 03 04

if (buffer [0] == 0x50 && buffer [1] == 0x4b && buffer [2] == 0x03 && buffer [3] == 0x04)

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

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

byte [] dataPDF =...

var okPDF = PDFCorrect (dataPDF);

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Я проверяю файл заголовка следующим образом:

 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;

    }

Ответ 3

Первая строка файла PDF - это заголовок, определяющий версию спецификации PDF к которому файл соответствует %PDF-1.0, %PDF-1.1, %PDF-1.2, %PDF-1.3, %PDF-1.4 и т.д.

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

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

Ответ 4

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

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

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

Мой способ надежной проверки на наличие повреждений PDF

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

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

Однако: вы хотите, чтобы это произошло быстро и автоматически. И вы хотите использовать метод программно или через сценарий для проверки многих PDF файлов.

Вот хитрость:

  • Не позволяйте Ghostscript отображать файл на дисплее или в реальном (графическом) файле.
  • nullpage этого nullpage устройство nullpage Ghostscript.

Вот пример командной строки:

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, обрабатывающие файл input.pdf, по-прежнему будут отображаться в вашей консоли. -r36x36 устанавливает разрешение 36 точек на дюйм, чтобы ускорить проверку.

%errorlevel% (или $? в Linux) будет 0 для не поврежденного файла. Это будет non- 0 для поврежденных файлов. И любые предупреждения или сообщения об ошибках, появляющиеся в stdout, могут помочь вам определить проблемы с input.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.

Ответ 5

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

Ответ 6

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

------------ e56a47d13b73819f84d36ee6a94183 Content-Disposition: form-data; name= "пар" ... и т.д.

Таким образом, проверка "% PDF" не будет работать.

Ответ 7

Что я делаю:

Расширение 1.Validate

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

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

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