PDFNetPython3中font.MapToUnicode字符大小写映射错误技术问询
PDFTron库
font.MapToUnicode方法返回大小写错误字符的问题 基础问题
PDFTron库的font.MapToUnicode方法返回大小写错误的字符。
详细说明
在某本特定书籍的PDF文件中,部分字符的char_code对应大写字母,但通过font.MapToUnicode映射返回的却是小写字符,推测是字体字符与字形映射存在问题。
环境
- PDFNetPython3版本:9.4.2
现象
原PDF中的大写字母(如'O')被PDFTron文本提取器提取为小写字母(如'o'),对应截图:
代码示例
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
相关产品推荐
相关产品推荐

