如何使用VB.NET从带有IDENTITY-H字体的PDF文件中提取文本

如何使用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.

我有一个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.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 
    
    端函数

  • 公共可重写子RenderText(ByVal renderInfo作为TextRenderInfo)实现ITextractionStrategy.RenderText

    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文件中并非如此。是这样吗?