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,此处唯一有效的值是 MacRomanEncoding、MacExpertEncoding 和 WinAnsiEncoding ,参见 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 列的信息。
我在我们的软件中有一种方法可以从 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,此处唯一有效的值是 MacRomanEncoding、MacExpertEncoding 和 WinAnsiEncoding ,参见 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 列的信息。