如何使用VB.NET从带有IDENTITY-H字体的PDF文件中提取文本
我有一个PDF文件 我正在使用iTextSharp类以语法形式阅读PDF文件中的文本。 它读取Ansi编码文本,但不读取IDENTITY-H编码文本 我的问题是如何使用VB.Net从pdf文件中读取IDENTITY-H文本 下面是我的代码:如何使用VB.NET从带有IDENTITY-H字体的PDF文件中提取文本,vb.net,pdf,Vb.net,Pdf,我有一个PDF文件 我正在使用iTextSharp类以语法形式阅读PDF文件中的文本。 它读取Ansi编码文本,但不读取IDENTITY-H编码文本 我的问题是如何使用VB.Net从pdf文件中读取IDENTITY-H文本 下面是我的代码: 公共函数ReadPdfile(ByVal strSource作为字符串)作为字符串 Dim sbPDFText As New StringBuilder() 'StringBuilder Object To Store read Text If File.
Dim sbPDFText As New StringBuilder() 'StringBuilder Object To Store read Text
If File.Exists(strSource) Then 'Does File Exist?
Dim pdfFileReader As New PdfReader(strSource) 'read File
For intCurrPage As Integer = 1 To pdfFileReader.NumberOfPages 'Loop Through All Pages
Dim lteStrategy As LocTextExtractionStrategy = New LocTextExtractionStrategy 'Read PDF File Content Blocks
'Get Text
Dim strCurrText As String = PdfTextExtractor.GetTextFromPage(pdfFileReader, intCurrPage, lteStrategy)
sbPDFText.Append(strCurrText) 'Add Text To String Builder
Next
pdfFileReader.Close() 'Close File
End If
Return sbPDFText.ToString() 'Return
端函数
Dim segment As LineSegment = renderInfo.GetBaseline()
Dim location As New TextChunk(renderInfo.GetText(), segment.GetStartPoint(), segment.GetEndPoint(), renderInfo.GetSingleSpaceWidth())
If renderInfo.GetText = "" Then
Console.WriteLine(GetResultantText())
End If
With location
'Chunk Location:
Debug.Print(renderInfo.GetText)
.PosLeft = renderInfo.GetDescentLine.GetStartPoint(Vector.I1)
.PosRight = renderInfo.GetAscentLine.GetEndPoint(Vector.I1)
.PosBottom = renderInfo.GetDescentLine.GetStartPoint(Vector.I2)
.PosTop = renderInfo.GetAscentLine.GetEndPoint(Vector.I2)
'Chunk Font Size: (Height)
.curFontSize = .PosTop - segment.GetStartPoint()(Vector.I2)
'Use Font name and Size as Key in the SortedList
Dim StrKey As String = renderInfo.GetFont.PostscriptFontName & .curFontSize.ToString
'Add this font to ThisPdfDocFonts SortedList if it's not already present
If 1 = 1 Then
If Not ThisPdfDocFonts.ContainsKey(StrKey) Then ThisPdfDocFonts.Add(StrKey, renderInfo.GetFont)
'Store the SortedList index in this Chunk, so we can get it later
.FontIndex = ThisPdfDocFonts.IndexOfKey(StrKey)
Console.WriteLine(renderInfo.GetFont.ToString & "-->" & StrKey)
Else
'pcbContent.SetFontAndSize(BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 9)
.FontIndex = 3
.curFontSize = 8
End If
End With
locationalResult.Add(location)
端接头感谢您分享PDF文档。这有助于我们确定您描述的问题不是iTextSharp问题。相反,这是PDF文档本身的问题 这个问题没有解决方案,但我提供这个答案是为了解释当iTextSharp不参与时,您如何自己发现问题也存在 在Adobe Reader中打开文档。选择文本“Muy señores nuestros”,并将其复制/粘贴到文本编辑器中。你会得到“Muy señores nuestros”。这是可以使用iTextSharp提取的文本(它工作正常)
现在对文本“GUARDIAN GLASS EXPRESS,S.L.”执行相同的操作。您将得到以下结果:“你把各种各样的概念混在一起,使你的问题变得非常混乱。事实上,字体的一个子集被嵌入是完全不相关的。当编码为IDENTITY_H时,提取的文本将使用UNICODE编码。您正在使用不同的编码在记事本中复制/粘贴UNICODE字符,这解释了为什么您只看到方形框。您需要将提取的文本视为unicode文本,而不是WINANSI文本。感谢Bruno的回复。我已经编辑了这个问题。我想请您阅读“IDENTITY_H”编码字体。您的问题标题和问题正文不匹配。你的问题主体告诉我你想提取文本。你问题的标题告诉我你想提取字体。那没有道理。我会在下一篇评论中解释为什么你的问题是无效的(有些人会说“愚蠢”),这可能也解释了为什么它被关闭。字体程序(例如存储在TTF或OTF文件中)包含大量关于字符和字形的数据。在PDF中嵌入字体时,并非所有数据都复制到PDF中。一些数据存储在PDF对象中(例如具有字形宽度的数组),其他数据则被忽略(例如:如果字母Q未出现在文档中,则不会存储在嵌入的子集中)。绘制文档中使用的glyph所需的语法存储在流中,但该语法只是数据的一部分。从PDF创建字体文件是不可能的(没有做到,有时是不合法的)。我假设您想要提取文本,但您继续谈论字体(这非常令人困惑)。提取文本时,字体不相关。重要的是编码。您使用的是哪个版本的iTextSharp?谢谢您的回复。如果转到文档属性-->“字体”选项卡。它显示了两种不同类型的编码。一个是“Ansi”编码,另一个是“Identity-H”编码。所以我认为我们可以复制/粘贴到文本编辑器的文本有“Ansi”编码,我们复制/粘贴到文本编辑器中的文本得到以下结果:“我们可以复制/粘贴到文本编辑器中的文本”Muy señores nuestros“有“Ansi”编码和文本“GUARDIAN GLASS EXPRESS,S.L.”我们将其复制/粘贴到文本编辑器中,并得到以下结果:“我不明白为什么你如此痴迷于一种字体使用Ansi,另一种字体使用Identity-H。有成千上万的PDF使用带有Identity-H的嵌入式字体,可以正确提取文本。你的PDF是个例外。字体的使用方式可能有问题。不清楚您对StackOverflow读者的期望。非常感谢您的回复。这意味着十六进制字符串中使用的字符应与字形的UNICODE值相对应,而我发送给您的PDF文件中并非如此。非常感谢您的回复。这意味着十六进制字符串中使用的字符应该与字形的UNICODE值相对应,而在我发送给您的PDF文件中并非如此。是这样吗?