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

如何用PDF Pig提取PDF特定字体字符?C#替代开源库咨询

使用PDF Pig提取PDF中的斜体文本

PDF Pig完全可以实现提取斜体文本的需求,你之前的思路方向没问题,但需要深入到字形(Glyph)的字体属性层面,而不是仅遍历字符串形式的单词。PDF Pig的Word对象包含组成它的Glyph集合,每个Glyph关联的Font对象提供了判断斜体的直接依据。

具体实现步骤

  1. 先安装PDF Pig的NuGet包:Install-Package UglyToad.PdfPig
  2. 遍历PDF的每一页,获取所有单词后,检查单词内字形的字体是否标记为斜体
  3. 收集所有符合条件的文本,拼接成目标字符串

示例代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 04:45:43