使用True Type Fonts时,iTextSharp无法看到PDF上的文本

本文关键字:PDF 文本 Type True Fonts iTextSharp 使用 | 更新日期: 2023-09-27 18:03:31

这个问题是预期的,因为True Type Fonts实际上是一个图像,而不是一个字体。您必须使用图像识别技术才能完成读取。这个问题已经提过很多次了,所以我向公众给出了一个答案。

问:当无法读取PDF的字体时如何解析PDF的位置目的。例如:一个知道第1页的帐号,或者一个页码"例如,打印为双面打印,而不是文档计数"。

我在管理语句时遇到了这个问题。我需要知道我在哪一页,我在哪里,上面有什么。我开始意识到,不同的打印软件输出不同的文件需求,但你通常可以在PDF输出文件的注释中找到它们,你正在阅读。例如,我正在使用iTextSharp在PDF中找到的"托盘呼叫ID"。下面演示了一个示例:

使用True Type Fonts时,iTextSharp无法看到PDF上的文本

我首先使用一个简单的方法来测试文档的字体类型

 public void SetFontType()
    {            
       this.PdfReaderContentParser = new PdfReaderContentParser(this.PdfReaderMain);
        //Here we see if we can read the text from the extraction. If not, we know it is a TT font.
        ITextExtractionStrategy iTextExtractionStrategy = this.PdfReaderContentParser.ProcessContent(1, new SimpleTextExtractionStrategy());
        String pdfText = iTextExtractionStrategy.GetResultantText();
        this.TextType = String.IsNullOrEmpty(pdfText) ? TextType.TrueTypeFont : TextType.Default;            
    }

当我确定它是不可读的,并且遇到了True Type字体的情况时,我然后执行以下操作来读取PDF[不包括不必要的代码]

下面的代码在注释中循环查找需要搜索的特殊内容。在这种情况下,我正在寻找MT3类型搜索,或者我在覆盖中使用的项目列表。每种情况都是独特的,但它总结了剥离文档注释的基本概念。这在iText的文档中也有简要说明。

public static Boolean CycleAnnotations(PdfReader reader, int pageIndex, PdfJob job)
        {
            List<string> keys = job.ConfigurationSettings.Where(cfs => cfs.Condition != null).Select(cs => cs.Condition).ToList();
            bool found = CycleAnnotations(reader, pageIndex, keys);
            if (found)
            {
                return found;
            }
            else
            {
                return CycleAnnotations(reader, pageIndex, "MT(TR3)"); //default key
            }
        }
        public static Boolean CycleAnnotations(PdfReader reader, int pageIndex, string key)
        {
            PdfDictionary pdfDictionary = reader.GetPageN(pageIndex);
            PdfArray annots = pdfDictionary.GetAsArray(PdfName.ANNOTS);
            if (annots != null)
            {
                foreach (var iter in annots)
                {
                    PdfDictionary annot = (PdfDictionary)PdfReader.GetPdfObject(iter);
                    PdfString content = (PdfString)PdfReader.GetPdfObject(annot.Get(PdfName.CONTENTS));
                    if (content != null)
                    {
                        if (Utilities.IsAnnotationFound(content, key))
                        {
                            return true;
                        }
                    }
                }
            }
            return false;
        }
        public static Boolean CycleAnnotations(PdfReader reader, int pageIndex, List<string> keys)
        {
            PdfDictionary pdfDictionary = reader.GetPageN(pageIndex);
            PdfArray annots = pdfDictionary.GetAsArray(PdfName.ANNOTS);
            foreach (string keyItem in keys)
            {
                if (annots != null)
                {
                    foreach (var iter in annots)
                    {
                        PdfDictionary annot = (PdfDictionary)PdfReader.GetPdfObject(iter);
                        PdfString content = (PdfString)PdfReader.GetPdfObject(annot.Get(PdfName.CONTENTS));
                        if (content != null)
                        {
                            if (Utilities.IsAnnotationFound(content, keyItem))
                            {
                                return true;
                            }
                        }
                    }
                }
            }

希望这能帮助到一些人,并有一个美好的一天!