You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PDFNetPython3中font.MapToUnicode字符大小写映射错误技术问询

PDFTron库font.MapToUnicode方法返回大小写错误字符的问题

基础问题

PDFTron库的font.MapToUnicode方法返回大小写错误的字符。

详细说明

在某本特定书籍的PDF文件中,部分字符的char_code对应大写字母,但通过font.MapToUnicode映射返回的却是小写字符,推测是字体字符与字形映射存在问题。

环境

  • PDFNetPython3版本:9.4.2

现象

原PDF中的大写字母(如'O')被PDFTron文本提取器提取为小写字母(如'o'),对应截图:
PDF中的大写字母显示

代码示例

from PDFNetPython3.PDFNetPython import PDFNet, PDFDoc, ElementReader, Element, Point
from PDFNetPython3.PDFNetPython import Font, GState, ColorSpace, PatternColor, PathData

class CharFromPDF:
    def __init__(self):
        pass

    def print_char_from_pdf(self, pdf_file_path):
        PDFNet.Initialize("demo:1691991990538:7c56930b030000000055aed6bf8e4eb6a00bb237070a3797ee21cafe95")
        doc = PDFDoc(pdf_file_path)
        doc.InitSecurityHandler()
        page_begin = doc.GetPageIterator()
        page_reader = ElementReader()

        itr = page_begin
        while itr.HasNext():
            page_reader.Begin(itr.Current())
            self.process_elements(page_reader)
            page_reader.End()
            itr.Next()
        doc.Close()
        PDFNet.Terminate()
        print("Done.")

    def process_path(self, reader, path):
        gs = path.GetGState()
        gs_itr = reader.GetChangesIterator()
        while gs_itr.HasNext():
            if gs_itr.Current() == GState.e_fill_color:
                if (gs.GetFillColorSpace().GetType() == ColorSpace.e_pattern and
                        gs.GetFillPattern().GetType() != PatternColor.e_shading):
                    reader.PatternBegin(True)
                    self.process_elements(reader)
                    reader.End()
            gs_itr.Next()
        reader.ClearChangeList()

    def process_text(self, page_reader):
        # Begin text element
        element = page_reader.Next()
        while element is not None:
            element_type = element.GetType()
            if element_type == Element.e_text_end:
                return
            elif element_type == Element.e_text:
                gs = element.GetGState()
                font = gs.GetFont()
                if font.GetType() == Font.e_Type3:
                    itr = element.GetCharIterator()
                    while itr.HasNext():
                        page_reader.Type3FontBegin(itr.Current())
                        self.process_elements(page_reader)
                        reader.End()
                else:
                    itr = element.GetCharIterator()
                    while itr.HasNext():
                        char_code = itr.Current().char_code
                        a = font.MapToUnicode(char_code)
                        print("Char: ", a[0], " ascii code: ", ascii(a[0]), "char_code", char_code,
                              " Font Name: ", font.GetName())
                        itr.Next()
            print("")
            element = page_reader.Next()

    def process_elements(self, reader):
        element = reader.Next()
        while element is not None:
            element_type = element.GetType()
            if element_type == Element.e_path:
                self.process_path(reader, element)
            elif element_type == Element.e_text_begin:
                self.process_text(reader)
            elif element_type == Element.e_form:
                reader.FormBegin()
                self.process_elements(reader)
                reader.End()
            element = reader.Next()
if __name__ == "__main__":
    cfp = CharFromPDF()
    input_file_path = "text_issue.pdf"
    cfp.print_char_from_pdf(pdf_file_path=input_file_path)

在上述代码中,font.MapToUnicode方法接收对应大写字母的char_code,却返回小写字母。尝试使用同库的文本提取器,结果字符大小写情况正常,但仅以文本形式返回。

诉求

寻求针对该问题的技术支持与解决方案。

内容的提问来源于stack exchange,提问作者Damodhar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:25:27