IText в С#: GetPage возвращает все страницы с первого

Я использую библиотеку iText в C#/Net5 (5.0.1). Библиотека устанавливается с помощью NuGet и имеет версию 7.1.13. Я хочу читать PDF-документы и выполнять поиск внутри текста.

Моя проблема связана с API GetPage(n). Я предполагал, что он читает страницу n, но дело в том, что возвращаются все страницы от 1 до n.

Это мой код для получения содержимого PDF

        public PdfDocument? GetPdfContent() {
            PdfDocument? document = null;
            HttpWebRequest? request = null;
            HttpWebResponse? response = null;
            Stream? responseStream = null;
            MemoryStream? memoryStream = null;

            try {
                request = WebRequest.CreateHttp(_contentUrl);
            } catch (ArgumentNullException e) {
                Log.Logger.LogError(e, "Null address/URL in WebContent.GetPdfContent");
                throw new ContentSearchException(ContentSearchErrorCode.ContentNotAccessible, "Null address/URL", e);
            } catch (UriFormatException e) {
                Log.Logger.LogError(e, "Invalid address/URL in WebContent.GetPdfContent " + _contentUrl);
                throw new ContentSearchException(ContentSearchErrorCode.ContentNotAccessible, "Invalid address/URL", e);
            } catch (NotSupportedException e) {
                Log.Logger.LogError(e, "Invalid protocol URL in WebContent.GetPdfContent. Only http and https are supported. " + _contentUrl);
                throw new ContentSearchException(ContentSearchErrorCode.ContentNotAccessible, "Invalid protocol URL", e);
            } catch (SecurityException e) {
                Log.Logger.LogError(e, "Cannot contect to uri. Invalid user/password provided. " + _contentUrl);
                throw new ContentSearchException(ContentSearchErrorCode.ContentNotAccessible, "Invalid user/password", e);
            }

            if (request != null) {
                // Configure request
                request.Method = "GET";

                // Automatic redirection enabled
                request.AllowAutoRedirect = true;

                // acept-encoding: deflate, gzip
                request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;

                if (_accept != null) {
                    request.Accept = _accept;
                }
                request.Headers.Add(HttpRequestHeader.UserAgent, "sample/0.0.0");

                if (_authorization != null) {
                    request.Headers.Add(HttpRequestHeader.Authorization, _authorization);
                }
                try {
                    using (response = (HttpWebResponse)request.GetResponse()) {
                        if (response.StatusCode != HttpStatusCode.OK) {
                            if (response.StatusCode == HttpStatusCode.NotFound) {
                                throw new ContentSearchException(ContentSearchErrorCode.ContentNotFound, $"Error topic not found: {response.StatusCode} {response.StatusDescription}.");
                            } else {
                                throw new ContentSearchException(ContentSearchErrorCode.ContentNotAccessible, $"Error returned by server: {response.StatusCode} {response.StatusDescription}.");
                            }
                        } else if (String.IsNullOrEmpty(response.ContentType) || response.ContentType.Split(";")[0] != "application/pdf") {
                            throw new ContentSearchException(ContentSearchErrorCode.InvalidContentType, $"Error invalid content type {response.ContentType}.");
                        } else {
                            try {
                                using (responseStream = response.GetResponseStream()) {
                                    memoryStream = new MemoryStream();
                                    responseStream.CopyTo(memoryStream);
                                    // memoryStream remains open!
                                    memoryStream.Position = 0;

                                    document = new PdfDocument(new PdfReader(memoryStream));

                                    responseStream.Close();
                                    memoryStream.Close();
                                }
                            } catch (Exception e) {
                                // Error in GetResponseStream
                                throw new ContentSearchException(ContentSearchErrorCode.ContentNotAccessible, $"Error reading response: {e.Message}", e);
                            }
                        }
                        response.Close();
                    }
                } catch (Exception e) {
                    // Error in GetResponse
                    throw new ContentSearchException(ContentSearchErrorCode.ContentNotAccessible, $"Error getting response: {e.Message}", e);
                }
            }

            return document;

        }

И это сбойный код с GetPage

        private List<string> GetStringPdfContent() {
            List<string> ret = null;

            // iText
            PdfDocument pdfContent;
            PdfPage page;
            ITextExtractionStrategy strategy;
            string strPage;


            pdfContent = (PdfDocument)GetContent();
            if (pdfContent != null) {
                ret = new List<string>();

                // Code for iText
                strategy = new SimpleTextExtractionStrategy();
                for (int i = 1; i <= pdfContent.GetNumberOfPages(); i++) {
                    page = pdfContent.GetPage(i);
                    strPage = PdfTextExtractor.GetTextFromPage(page, strategy);

                    Log.Logger.LogDebug($"[GetStringPdfContent] Extracted page {i} with length {strPage.Length}.");
                    ret.Add(strPage);
                }
            }
            return ret;
        }

Это пример вывода. Как видите, мы получаем страницы 1, 1-2, 1-3 и так далее...

dbug: Spider.Program[0]
      [23/12/2020 17:47:59.793]: [GetStringPdfContent] Extracted page 1 with length 615.
dbug: Spider.Program[0]
      [23/12/2020 17:48:10.207]: [GetStringPdfContent] Extracted page 2 with length 2659.
dbug: Spider.Program[0]
      [23/12/2020 17:48:12.112]: [GetStringPdfContent] Extracted page 3 with length 4609.
dbug: Spider.Program[0]
      [23/12/2020 17:48:13.255]: [GetStringPdfContent] Extracted page 4 with length 7273.
dbug: Spider.Program[0]
      [23/12/2020 17:48:16.155]: [GetStringPdfContent] Extracted page 5 with length 9245.
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
Включение UTF-8 в jsPDF с помощью Angular
Включение UTF-8 в jsPDF с помощью Angular
Привет, разработчики, я предполагаю, что вы уже знаете, как экспортировать pdf через jsPDF. Если ответ отрицательный, то вы можете ознакомиться с моей...
1
0
519
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Моя проблема связана с API GetPage(n). Я предполагал, что он читает страницу n, но дело в том, что возвращаются все страницы от 1 до n.

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

Ошибка заключается в том, что ваш код повторно использует один и тот же объект SimpleTextExtractionStrategy на всех страницах. SimpleTextExtractionStrategy собирает весь полученный текст, поэтому, если вы сначала используете его для страницы 1, а затем для страницы 2, он будет содержать текст обеих страниц.

Таким образом, создайте отдельный объект стратегии извлечения текста для каждой страницы:

for (int i = 1; i <= pdfContent.GetNumberOfPages(); i++) {
    strategy = new SimpleTextExtractionStrategy();
    page = pdfContent.GetPage(i);
    strPage = PdfTextExtractor.GetTextFromPage(page, strategy);

    Log.Logger.LogDebug($"[GetStringPdfContent] Extracted page {i} with length {strPage.Length}.");
    ret.Add(strPage);
}

Спасибо! Я запутался со страницей понятий и стратегией!

Sourcerer 23.12.2020 23:41

Это идеально, как раз то, что я искал. Спасибо!

NautMeg 28.04.2022 17:58

Другие вопросы по теме