Поиск и замена текста в PDF-файле с помощью библиотеки iText
Мне нужно найти и заменить строку-заполнитель в PDF-файле. PDF-файл загружен библиотекой iText, и я пытался следовать образцам кода, чтобы следовать некоторым образцам кода, которые я откопал, чаще всего для оригинальной реализации Java.
Проблема в том, что образцы не работают для моего PDF-файла. Я получаю PdfDictionary с PdfObjects, но когда я пытаюсь отфильтровать объекты с текстами, я не получаю никаких результатов. Я знаю, что там есть текст, потому что сначала я взглянул на содержимое файла с помощью PDF-анализатора. Парсер не позволит мне вносить изменения и записывать их обратно, но, по крайней мере, я знаю, что там есть что-то, что можно найти.
Присмотревшись повнимательнее к объекту PdfDictionary, я обнаружил в нем только одну разновидность PdfObject: PdfIndirect reference. Название предполагает, что я должен разрешить эти ссылки, чтобы получить объекты, которые я могу исследовать и изменять, но я не могу найти никакого примера кода для этого.
Что я уже пробовал:
В данный момент мне приходится работать с импровизированной установкой с несколькими компьютерами и удаленными рабочими столами, поэтому я не могу просто опубликовать свой экспериментальный код прямо сейчас. Вот что у меня есть:
1) Откройте PdfReader (работает)
2) получить объект PdfDocument с помощью считывателя (работает)
3) перебираем страницы документа и получаем объект Pdfpage (работает)
4) (для каждой страницы) получить PdfDictionary из объекта страницы (работает)
5) получить Pdf-объекты из словаря с помощью dictionary.Get(PdfName.Содержание) (произведения)
6) Обычно мне просто нужно было бы повторить результаты шага 5), но я получаю только объекты PdfIndirectReference. Как я могу разрешить и отредактировать эти ссылки?
MemoryStream stream; PdfReader reader; PdfDocument document; Dictionary<String, PdfFormField> fields; PdfPage page; PdfDictionary dict; PdfStream content; int pages; int i; using (stream = new MemoryStream(BinaryFile)) { using (reader = new PdfReader(stream)) { using (document = new PdfDocument(reader)) { pages = document.GetNumberOfPages(); for (i = 1; i <= pages; i++) { page = document.GetPage(i); dict = page.GetPdfObject(); var xcontent = dict.Get(PdfName.Contents); if (xcontent != null) { PdfArray thearray= xcontent as PdfArray; foreach (PdfObject obj in thearray) { // these objects actually are PdfIndirectReferences // converting them leads nowhere, so here is the point // where I would have to resolve the reference and use whatever // objects I might obtain that way. PdfStream strm = obj as PdfStream; if(strm != null) { byte[] data = strm.GetBytes(); UTF8Encoding enc = new UTF8Encoding(); string test = enc.GetString(data); } } } } } } }
ZurdoDev
Было бы полезно, если бы вы нажали кнопку улучшить вопрос и показали только какой-то соответствующий код.
CodeWraith
Как вам угодно, но я сомневаюсь, что это очень поможет. Пока все в порядке, но что я могу сделать с косвенными ссылками оттуда?
ZurdoDev
Это всегда помогает убедиться, что мы понимаем, что вы говорите.
Это может помочь, https://stackoverflow.com/questions/37014984/how-to-read-text-of-appearance-stream
CodeWraith
Спасибо. Я уже сделал первый взгляд, и это выглядит так, как будто я хожу по кругу. Проблема всегда заключается в том, что я должен спросить, какие объекты я хочу видеть из документа, а "содержание" дает только косвенные ссылки. Я был бы очень рад перейти непосредственно к делу, но понятия не имею, где на самом деле хранится текст в документе или как его попросить.