如何用PDF Pig提取PDF特定字体字符?C#替代开源库咨询
使用PDF Pig提取PDF中的斜体文本
PDF Pig完全可以实现提取斜体文本的需求,你之前的思路方向没问题,但需要深入到字形(Glyph)的字体属性层面,而不是仅遍历字符串形式的单词。PDF Pig的Word对象包含组成它的Glyph集合,每个Glyph关联的Font对象提供了判断斜体的直接依据。
具体实现步骤
- 先安装PDF Pig的NuGet包:
Install-Package UglyToad.PdfPig - 遍历PDF的每一页,获取所有单词后,检查单词内字形的字体是否标记为斜体
- 收集所有符合条件的文本,拼接成目标字符串
示例代码:
using UglyToad.PdfPig; using UglyToad.PdfPig.Content; using UglyToad.PdfPig.Fonts; var italicTextBuilder = new StringBuilder(); using (var pdfDocument = PdfDocument.Open("target-file.pdf")) { foreach (var page in pdfDocument.GetPages()) { foreach (var word in page.GetWords()) { bool isItalicWord = false; // 遍历单词的所有字形,检查字体是否为斜体(多数PDF中斜体字体会统一标记) foreach (var glyph in word.Glyphs) { if (glyph.Font is PdfFont targetFont && targetFont.IsItalic) { isItalicWord = true; break; } } if (isItalicWord) { italicTextBuilder.Append(word.Text).Append(" "); } } } } // 最终提取的斜体文本 string extractedItalicText = italicTextBuilder.ToString().Trim();
补充:处理未明确标记斜体的字体
部分PDF的字体可能没有通过IsItalic属性标记,但字体名称会包含"Italic"或"Oblique"关键词,此时可以补充判断逻辑:
bool isItalic = targetFont.IsItalic || targetFont.Name.Contains("Italic", StringComparison.OrdinalIgnoreCase) || targetFont.Name.Contains("Oblique", StringComparison.OrdinalIgnoreCase);
替代开源库(若PDF Pig不满足需求)
如果PDF Pig的字体检测逻辑不符合你的特定PDF场景,可以尝试以下C#开源库:
1. iText 7 .NET
基于AGPL协议开源,对PDF结构的解析粒度极细,能精准识别文本的字体样式:
using iText.Kernel.Pdf; using iText.Kernel.Pdf.Canvas.Parser; using iText.Kernel.Pdf.Canvas.Parser.Data; using iText.Kernel.Pdf.Canvas.Parser.Listener; var italicTextBuilder = new StringBuilder(); using (var pdfDoc = new PdfDocument(new PdfReader("target-file.pdf"))) { for (int pageNum = 1; pageNum <= pdfDoc.GetNumberOfPages(); pageNum++) { var extractionStrategy = new FilteredTextEventListener( new LocationTextExtractionStrategy(), new ItalicTextFilter() ); var processor = new PdfCanvasProcessor(extractionStrategy); processor.ProcessPageContent(pdfDoc.GetPage(pageNum)); italicTextBuilder.Append(extractionStrategy.GetResultantText()).Append(" "); } } string extractedItalicText = italicTextBuilder.ToString().Trim(); // 自定义过滤器筛选斜体文本 public class ItalicTextFilter : IEventFilter { public bool Accept(IEventData data, EventType type) { if (type != EventType.RENDER_TEXT) return false; var renderInfo = (TextRenderInfo)data; return renderInfo.GetFont().GetFontProgram().IsItalic(); } }
2. PdfSharp
MIT协议开源的轻量级PDF处理库,可通过字体名称关键词判断斜体:
using PdfSharp.Pdf; using PdfSharp.Pdf.Content; using PdfSharp.Pdf.Content.Objects; var italicTextBuilder = new StringBuilder(); var pdfDocument = PdfReader.Open("target-file.pdf", PdfDocumentOpenMode.Import); foreach (PdfPage page in pdfDocument.Pages) { var contentReader = ContentReader.ReadContent(page); TraverseContentNodes(contentReader.Root, italicTextBuilder); } string extractedItalicText = italicTextBuilder.ToString().Trim(); // 递归遍历PDF内容节点,筛选斜体文本 void TraverseContentNodes(CObject contentObj, StringBuilder textBuilder) { if (contentObj is CText textNode) { var font = textNode.Font; if (font != null && (font.Name.Contains("Italic", StringComparison.OrdinalIgnoreCase) || font.Name.Contains("Oblique", StringComparison.OrdinalIgnoreCase))) { textBuilder.Append(textNode.Text).Append(" "); } } else if (contentObj is CSequence sequenceNode) { foreach (var childNode in sequenceNode) { TraverseContentNodes(childNode, textBuilder); } } }
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

