Member 13304618 Ответов: 1

Как обнаружить скрытый текст в PDF с помощью iTextsharper с помощью C#


Ниже у нас есть PDF-документ, в котором скрыт некоторый текст (покрытый белым прямоугольником). Можно ли использовать метод iTextSharp для определения того, есть ли в PDF скрытый текст или нет?

У меня действительно есть пример из PDF со скрытым текстом и двумя способами мы извлекаем текст из PDF

Ниже приведены два примера того, как мы извлекаем текст из PDF-файла

Заранее благодарю вас всех за вашу помощь
public string ReadFile(string Filename)
{
    PdfReader reader = new PdfReader(Filename);

    string pdfText = string.Empty;
    string OCRErrorPages = string.Empty;

    for (int i = 1; i <= reader.NumberOfPages; i++)
    {
        iTextSharp.text.pdf.parser.ITextExtractionStrategy its = new iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy();

        String extractText = iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(reader, i, its);

        extractText = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(extractText)));

        if (extractText != "")
        {
            pdfText = pdfText + extractText;
        }
        else
        {
            OCRErrorPages = OCRErrorPages + i + extractText + "<br>";
        }
    }
    reader.Close();
    if (OCRErrorPages != "")
    {
        return OCRErrorPages + " This page contains no text";
    }
    else
    {
        return pdfText;
    }

}

public string ExtractText(string inFileName)
{
    string line = string.Empty;
    // Create a reader for the given PDF file
    PdfReader reader = new PdfReader(inFileName);

    int totalLen = 68;
    float charUnit = ((float)totalLen) / (float)reader.NumberOfPages;
    int totalWritten = 0;
    float curUnit = 0;

    for (int page = 1; page <= reader.NumberOfPages; page++)
    {
        line += ExtractTextFromPDFBytes(reader.GetPageContent(page)) + " ";

        var thing = reader.GetPageContent(page);

        // Write the progress.
        if (charUnit >= 1.0f)
        {
            for (int i = 0; i < (int)charUnit; i++)
            {
                Console.Write("#");
                totalWritten++;
            }
        }
        else
        {
            curUnit += charUnit;
            if (curUnit >= 1.0f)
            {
                for (int i = 0; i < (int)curUnit; i++)
                {
                    Console.Write("#");
                    totalWritten++;
                }
                curUnit = 0;
            }
        }
    }

    if (totalWritten < totalLen)
    {
        for (int i = 0; i < (totalLen - totalWritten); i++)
        {
            Console.Write("#");
        }
    }
    return line;
}


Что я уже пробовал:

Я попробовал использовать
PdfContentByte.TEXT_RENDER_MODE_INVISIBLE
вариант, но не знаю, как применить его в PDF reader

1 Ответов

Рейтинг:
0

Dave Kreskowiak

На самом деле это невозможно, так как существует множество различных способов "скрыть" текст или ошибочно прикрыть его другими элементами.

Ваш код должен был бы точно "понимать", как документ будет отображаться на любом размере страницы, на которой он просматривается/печатается. Он также должен был бы "понять", в очень точных терминах, что вы подразумеваете под "скрытым".

Нигде в текстовом потоке нет свойства, которое говорит, что оно не видно или частично покрыто.


Member 13304618

Дэйв, большое тебе спасибо за ответ. Однако в PDF acrobat reader есть свойство "Скрытый текст".

Есть ли способ получить доступ к этому свойству с помощью iTextSharp?

Dave Kreskowiak

Это битовое поле, чтобы читатель вообще не пытался визуализировать объект, даже если он не скрыт другим объектом. Существует также другое поле, называемое NoView, которое делает почти то же самое, за исключением того, что помеченный объект разрешается печатать.

Это не свойство, описывающее текст (или любой другой объект), который должен быть видимым, но скрыт другим объектом.

Это намного сложнее, чем вы думаете.

Если вы действительно хотите углубиться в это, вы можете прочитать всю спецификацию PDF здесь:
https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/pdf_reference_archives/PDFReference.pdf
..все ~1000 страниц из него.

Я не знаю и не использую iTextSharp, поэтому не могу сказать вам, как добраться до скрытого поля.