使用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"。下面演示了一个示例:
我首先使用一个简单的方法来测试文档的字体类型
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;
}
}
}
}
}
希望这能帮助到一些人,并有一个美好的一天!