Несколько вещей.
Во-первых, в моем blog post here Я обнаружил, что использование перегрузки конструктора, которая занимает RandomAccessFileOrArray
, является самым быстрым. Я только что снова тестировал исходный код, который у меня сидел (5.5.6.0), и он по-прежнему в два раза быстрее, чем метод пути на основе строк (для больших файлов). Тем не менее, эта перегрузка конструктора отмечена как obsolete
и фактически фактически может быть удалена в более поздних версиях, поэтому вам нужно будет иметь дело с этим.
PdfReader pdfReader = new PdfReader(new RandomAccessFileOrArray(pdfFullname, true), password);
Чтобы быть совершенно ясно, что перегрузка была специально удалена по какой-то причине, так что вы можете рассмотреть не использовать его.
Во-вторых, вопрос Is there a way check password without loading file to memory?
фактически вводит в заблуждение. Если бы память была на самом деле узким местом, у вас были бы гораздо большие проблемы. Я просто сделал быстрый тест, используя System.IO.File.ReadAllBytes()
в 80-мегабайтном файле, и потребовалось около 90 миллисекунд, чтобы загрузить все в память, а моему компьютеру семь лет.
Реальная проблема скорости заключается в том, что iText должен найти trailer
PDF, который имеет указатель на словарь /Encrypt
. Поскольку iText предназначен для использования на самом деле do что-то с PDF-файлом, он не тратит много времени на оптимизацию этого пути, потому что это произойдет в конечном итоге, несмотря ни на что. Если вы действительно, действительно заботитесь о скорости, я начну. Я бы рекомендовал проверить Adobe's spec, чтобы увидеть, как работает стандартное шифрование PDF, это относительно просто. Также есть great simplified description here.
Если ваша цель трещит вы должны быть в состоянии написать очень сырой пароль Guesser, который выглядит для трейлера, ищет и найти ключ /Encrypt
и обрабатывать /O
и /U
ключей. В этом есть много «gotchas», если вы не читали спецификацию, например, документы могут содержать несколько записей trailer
, есть альтернативы паролям и т. Д., Но это, вероятно, должно получить вам 99% общих PDF-файлов.
Попробуйте [этот перегруженный конструктор] (http://api.itextpdf.com/itext/com/itextpdf/text/pdf/PdfReader.html#PdfReader%28com.itextpdf.text.pdf.RandomAccessFileOrArray,%20byte [] ,% 20boolean% 29). – kuujinbo
@kuujinbo Это очень полезно. но по-прежнему имеют некоторое время между небольшим и большим файлом. –