2013-11-21 7 views
0

Я пытаюсь выяснить, как на самом деле (соответственно) читать для трейлера PDF Byte_offset_of_last_cross-reference_section из файла PDF.Как вы можете читать для определенного значения из двоичного файла, начиная с конца файла?

В соответствии со спецификацией PDF 1.7 (ISO 32000-1:2008) структура файла сконструирована таким образом, что его следует читать с конца файла. Вот пример того, что упрощенный (минимальный) трейлер выглядит, когда я использую StreamReader и прочитать файл строку за строкой (UTF8 Encoding):

прицепа
< < key1 value1
        key2 значение2
        ...
        Keyn valuen
> >
startxref
Byte_offset_of_last_cross-reference_section
%% EOF

trailer 
<</Root 7 0 R /Size 7>> 
startxref 
696 
%%EOF 

Значение Я хочу, чтобы каким-то образом захватить это значение . Я просто не знаю, как это сделать, используя BinaryReader, начиная с конца файла.

ответ

2

Вы можете использовать метод Seek, см. Примеры here. Вы можете использовать в качестве аргумента SeekOrigin.End см here других варианты

пример:

using (var reader = File.Open(...)) 
{ 
    reader.Seek(100, SeekOrigin.End); 
    //... 
} 

Вы можете начать читать в обратном цикле, пока вы дойдете до startxref маркеров (или что-нибудь, что поможет вам знать, что вы можете прочитать 696) или принять длину в 100 байт от конца файла, а затем выполнить поиск в этом маленьком массиве, как предложил Энтони в комментарии ниже.

+0

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

+1

Возможно, лучше начать с 'reader.Length - 50' и продолжать искать вперед, пока не найдете то, что вам нужно. Не уверен, насколько хорошо было бы на самом деле искать 1 байт за один раз назад в файле. – Anthony

+0

Это хороший момент !, добавив его в ответ –

0

Как насчет использования что-то вроде:

List<string> allLines = File.ReadAllLines(filePathHere); 
return allLines[allLines.Count - 2]; 
+1

В соответствии со спецификациями не рекомендуется читать строку строки за строкой. Рекомендуется (по заявлению вопроса) прочитать файл с конца до начала. –

+0

PDF-файлы могут быть довольно большими. Чтение всех строк, подобных этому, просто для получения одного номера - огромная трата ресурсов. – mkl