iText7 PdfTextExtractor.GetTextFromPage "StandardEncoding" не является поддерживаемым именем кодировки. " - PullRequest
0 голосов
/ 27 апреля 2020

В нашем программном обеспечении есть метод, который извлекает текст из PDF-файла, из сканирования или сгенерированного текста.

Обычно я сначала пробую метод GetTextFromPage (). Если он не возвращает текст, тогда я перехожу на OCR'ing на странице.

У меня есть конкретный 6-страничный PDF, первые три страницы которого являются отсканированным документом, а две последние - формой.

В этом PDF-файле появляется ошибка, которую я не могу понять, как ее решить.

'StandardEncoding' is not a supported encoding name. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.
Parameter name: name

   at System.Globalization.EncodingTable.internalGetCodePageFromName(String name)
   at System.Globalization.EncodingTable.GetCodePageFromName(String name)
   at iText.IO.Util.IanaEncodings.GetEncodingEncoding(String name)
   at iText.IO.Util.EncodingUtil.ConvertToBytes(Char[] chars, String encoding)
   at iText.IO.Font.PdfEncodings.ConvertToBytes(String text, String encoding)
   at iText.IO.Font.FontEncoding.FillNamedEncoding()
   at iText.IO.Font.FontEncoding.CreateFontEncoding(String baseEncoding)
   at iText.Kernel.Font.PdfType1Font..ctor(PdfDictionary fontDictionary)
   at iText.Kernel.Font.PdfFontFactory.CreateFont(PdfDictionary fontDictionary)
   at iText.Kernel.Pdf.Canvas.Parser.PdfCanvasProcessor.GetFont(PdfDictionary fontDict)
   at iText.Kernel.Pdf.Canvas.Parser.PdfCanvasProcessor.SetTextFontOperator.Invoke(PdfCanvasProcessor processor, PdfLiteral operator, IList`1 operands)
   at iText.Kernel.Pdf.Canvas.Parser.PdfCanvasProcessor.InvokeOperator(PdfLiteral operator, IList`1 operands)
   at iText.Kernel.Pdf.Canvas.Parser.PdfCanvasProcessor.ProcessContent(Byte[] contentBytes, PdfResources resources)
   at iText.Kernel.Pdf.Canvas.Parser.PdfTextExtractor.GetTextFromPage(PdfPage page, ITextExtractionStrategy strategy, IDictionary`2 additionalContentOperators)
   at iText.Kernel.Pdf.Canvas.Parser.PdfTextExtractor.GetTextFromPage(PdfPage page)
   at EFR.OCR.OCR.ExtractTextFromPDF(FileInfo fileInfo, Int32 StartingPage, Int32 NumberOfPages) in P:\Cloud\Dropbox\EF Recovery\OCRTest\EFR.OCR\OCR.vb:line 113

Я обработал много PDF-файлов с помощью своего кода, некоторый текст, некоторые сканы, некоторые смешались вместе. У некоторых были формы ... Это первый раз, когда у меня была эта ошибка.

Вот фрагмент моего кода ...

      Using reader As New iText.Kernel.Pdf.PdfReader(fileInfo.FullName)
        reader.SetUnethicalReading(True)
        Using sourceDoc As New iText.Kernel.Pdf.PdfDocument(reader)
            If NumberOfPages = 0 Then NumberOfPages = sourceDoc.GetNumberOfPages
            For i As Integer = StartingPage To StartingPage + NumberOfPages - 1


                Dim pageText As String = ""
                Try
                    pageText = iText.Kernel.Pdf.Canvas.Parser.PdfTextExtractor.GetTextFromPage(sourceDoc.GetPage(i))
                Catch ex As Exception
                    OCRLog.Log($"Error attempting to extract text from page {i}. {ex.ToString}")
                End Try


                If pageText = "" Then
                    'extract this page
                    Dim results As OCRResults = ExtractTextFromPDFImagePage(fileInfo.FullName, i)
                    pageText = results.Text
                    pageItems.Add(New OCRResults.PagesClass(results.Accuracy, True, pageText))
                Else
                    pageItems.Add(New OCRResults.PagesClass(100, False, pageText))
                End If

                stringBuilder.Append(pageText)
            Next

            Return New OCRResults(stringBuilder.ToString, pageItems)
        End Using
    End Using

Есть идеи?

1 Ответ

0 голосов
/ 28 апреля 2020

В PDF есть ошибка, как указано в тексте ошибки "'StandardEncoding' не является поддерживаемым именем кодировки.".

Шрифты на странице, которой вы поделились, используют имя Стандартное кодирование в их кодировках записей. Это не правильное имя здесь. Согласно спецификации ISO 32000-1 единственными допустимыми значениями здесь являются MacRomanEncoding , MacExpertEncoding и WinAnsiEncoding , см. Таблицу 111 - Записи в словаре шрифтов типа 1 - и Таблица 114 - Записи в словаре кодирования.

Adobe Preflight также жалуется на эти имена при проверке синтаксических ошибок:

An unexpected value is associated with the key
  Key: BaseEncoding
  Value: /StandardEncoding
  Type: CosName
  Formal Representation: Encoding
  Cos ID: 38
  Traversal Path: ->Pages->Kids->[0]->Resources->Font->WARSP->Encoding
An unexpected value is associated with the key
  Key: Encoding
  Value: /StandardEncoding
  Type: CosName
  Formal Representation: Font.FontType1
  Cos ID: 27
  Traversal Path: ->Pages->Kids->[0]->Resources->Font->Arial,Bold
An unexpected value is associated with the key
  Key: BaseEncoding
  Value: /StandardEncoding
  Type: CosName
  Formal Representation: Encoding
  Cos ID: 22
  Traversal Path: ->Pages->Kids->[0]->Resources->Font->Arial->Encoding
An unexpected value is associated with the key
  Key: BaseEncoding
  Value: /StandardEncoding
  Type: CosName
  Formal Representation: Encoding
  Cos ID: 19
  Traversal Path: ->Pages->Kids->[0]->Resources->Font->ARROW->Encoding

( Выдержка из предварительной проверки) отчет для вашего общего PDF)


Несмотря на то, что StandardEncoding не является здесь допустимым именем, спецификация PDF знает "Стандартную кодировку", см. Приложение D ISO 32000-1. Скорее всего, ваш документ пытается сослаться на эту кодировку в местах, описанных выше.

Если вам нужно извлечь текст из рассматриваемого документа, возможно, вы захотите следовать рекомендации сообщения об ошибке:

Информацию об определении пользовательской кодировки см. В документации по методу Encoding.RegisterProvider.

Класс Encoding здесь представлен в System.Text.

Для извлечения текста из вашего PDF, следовательно, должно быть достаточно реализовать EncodingProvider, который для имени StandardEncoding предоставляет экземпляр Encoding в соответствии с информацией из STD столбец таблицы в Приложении D.2 - Набор латинских символов и кодировки - ISO 32000-1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...