iText7 PdfTextExtractor.GetTextFromPage “'StandardEncoding' 不是受支持的编码名称。”

iText7 PdfTextExtractor.GetTextFromPage "'StandardEncoding' is not a supported encoding name."

我在我们的软件中有一种方法可以从 PDF、扫描件或生成的文本中提取文本。

我通常先尝试 GetTextFromPage() 方法。如果它不是 return 文本,那么我将继续对页面进行 OCR。

我有一个特定的 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

有什么想法吗?

PDF 中存在错误,如错误文本“'StandardEncoding' 不是受支持的编码名称”所示。

您共享的页面上的字体在其 Encoding 条目中使用名称 StandardEncoding。这不是一个有效的名称。根据规范 ISO 32000-1,此处唯一有效的值是 MacRomanEncodingMacExpertEncodingWinAnsiEncoding ,参见 Table 111 – Type 1 字体字典中的条目 – 和 Table 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

(Excerpt from a preflight report 对于您共享的 PDF)


尽管 StandardEncoding 在这里不是有效名称,但 PDF 规范知道 "Standard Encoding",请参阅 ISO 32000-1 的附录 D。您的文档很可能试图在上述位置引用该编码。

因此,如果您需要从相关文档中提取文本,您可能需要遵循错误消息的建议:

For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.

这里的Encoding class就是System.Text.

因此,要从您的 PDF 中提取文本,实现一个 EncodingProvider 就足够了,该 StandardEncoding 提供了一个 Encoding 实例来自 ISO 32000-1 附件 D.2 – 拉丁字符集和编码 table 的 STD 列的信息。