CodeWraith Ответов: 0

Поиск и замена текста в 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

Спасибо. Я уже сделал первый взгляд, и это выглядит так, как будто я хожу по кругу. Проблема всегда заключается в том, что я должен спросить, какие объекты я хочу видеть из документа, а "содержание" дает только косвенные ссылки. Я был бы очень рад перейти непосредственно к делу, но понятия не имею, где на самом деле хранится текст в документе или как его попросить.

0 Ответов