То, как этот человек написал этот метод, может показаться странным, если вы не понимаете внутренности PDF-файлов и / или iTextSharp. Метод принимает три параметра, первый из них - PdfDictionary
, который вы получаете, вызывая GetPageN(Integer)
на каждой из ваших страниц. Второй - это общий список, который нужно инициировать самостоятельно перед вызовом этого. Этот метод предназначен для вызова в цикле для каждой страницы в PDF, и каждый вызов будет добавлять изображения в этот список. Последний параметр, который вы уже поняли.
Итак, вот код для вызова этого метода:
''//Source file to read images from
Dim InputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "FileWithImages.pdf")
''//List to dump images into
Dim Images As New List(Of Byte())
''//Main PDF reader
Dim Reader As New PdfReader(InputFile)
''//Total number of pages in the PDF
Dim PageCount = Reader.NumberOfPages
''//Loop through each page (first page is one, not zero)
For I = 1 To PageCount
getAllImages(Reader.GetPageN(I), Images, Reader)
Next
ОЧЕНЬ, ОЧЕНЬ ВАЖНО - iTextSharp - НЕ средство рендеринга PDF, это PDF-композитор. Это означает, что он знает, что у него есть подобные объектам объекты, но он не обязательно много о них знает. Другими словами, iTextSharp знает, что данный байтовый массив представляет собой то, что в стандарте PDF называется изображением, но ему не важно, что это JPEG, TIFF, BMP или что-то еще. Все, что волнует iTextSharp, - это то, что этот объект имеет несколько стандартных свойств, которыми он может манипулировать, например X, Y, а также эффективную ширину и высоту. PDF рендеры будут обрабатывать преобразование байтов в реальное изображение. В этом случае вы являетесь средством визуализации PDF, поэтому ваша задача - выяснить, как обрабатывать массив байтов как изображение.
В частности, в этом методе вы увидите, что есть строка, которая гласит:
If filter = "/FlateDecode" Then
Это часто пишется как оператор select case
или switch
для обработки различных значений filter
. Метод, на который вы ссылаетесь, обрабатывает только FlateDecode
, что довольно распространено, хотя на самом деле существует 10 стандартных фильтров, таких как CCITTFaxDecode
, JBIG2Decode
и DCTDecode
(PDF Spec 7.4 - Фильтры). Вам следует изменить метод, включив в него какой-то улов (случай Else
или Default
), чтобы вы как минимум знали о изображениях, которые вы не настроили для обработки.
Кроме того, в разделе /FlatDecode
вы увидите эту строку:
Select Case Integer.Parse(bpp)
Это чтение атрибута, связанного с объектом изображения, который сообщает средству визуализации, сколько битов следует использовать для каждого цвета при разборе. Опять же, вы в этом случае являетесь рендером PDF, так что вам решать, что делать. Код, на который вы ссылаетесь, учитывает только монохромные (1 бит / с) или truecolor (24 бит / с) изображения, но другие обязательно должны учитываться, особенно 8 бит / с.
Итак, подводя итог, можно надеяться, что код работает для вас как есть, но не удивляйтесь, если он много жалуется и / или пропускает изображения. Извлечение изображений иногда может быть очень неприятным. Если вы столкнетесь с проблемами, начните новый вопрос со ссылкой на этот вопрос, и мы надеемся, что мы можем помочь вам больше!