繁体   English   中英

如何在C#中从pdf文档获取标签

[英]How to get Tags from pdf document in c#

我正在使用iTextSharp读取pdf文档,并且读取成功。 现在,我想从pdf文档中获取标签,但是我不知道如何使用iTextSharp获取标签。

代码如下

class Program
{
    static void Main(string[] args)
    {
        var result = pdfText(@"C:\Users\Purelogics\Desktop\tranfer\tagged.pdf");
    }

    public static string pdfText(string path)
    {
        PdfReader reader = new PdfReader(path);
        //This line return true that means this document is tagged
        bool isTagged = reader.IsTagged();
        var metadeta = reader.Metadata;
        IList<Dictionary<string, object>> bookmarks = SimpleBookmark.GetBookmark(reader);
        string text = string.Empty;
        var title = reader.Info["Title"];
        for (int page = 1; page <= reader.NumberOfPages; page++)
        {
            var object1 = reader.GetPdfObject(page);
            text += PdfTextExtractor.GetTextFromPage(reader, page);
        }
        reader.Close();
        return text;
    }
}

这完全取决于您要如何使用此标记。 假设您要提取标记为\\P所有内容(段落)

首先,您需要获取文档的structuretree根

File inputFile = new File("input.pdf");
PdfDocument pdfDocument = new PdfDocument(new PdfReader(inputFile));
IStructureNode root = pdfDocument.getStructTreeRoot();

既然您具有structuretree根,就可以对树进行爬网。 通过堆栈或递归。 在此示例中,我使用递归。

private Set<PdfNameMCIDGroup> find(PdfDocument pdfDocument, IStructureNode node){
    Set<PdfNameMCIDGroup> out = new HashSet<>();

    PdfName role = node.getRole();
    if(markedRoles.contains(role))
        out.add(mark(pdfDocument, node));
    else
        for(IStructureNode kid : node.getKids())
            out.addAll(find(pdfDocument, kid));

    return out;
}

这就是mark方法的样子

private PdfNameMCIDGroup mark(PdfDocument pdfDocument, IStructureNode node){
    PdfNameMCIDGroup out = new PdfNameMCIDGroup(0);

    Set<PdfMcr> leaves = new HashSet<>();
    Stack<IStructureNode> stk = new Stack<>();
    stk.push(node);
    while(!stk.isEmpty()){
        IStructureNode tmp = stk.pop();
        if(tmp instanceof PdfMcr)
            leaves.add((PdfMcr) tmp);
        else
            for(IStructureNode kid : tmp.getKids())
                stk.push(kid);
    }

    // mcids
    for(PdfMcr mcr : leaves){
        int mcid = mcr.getMcid();
        int pageNr = pdfDocument.getPageNumber(mcr.getPageObject());
        out.mcids.add(mcid);
        out.pageNrs.add(pageNr);
    }

    return out;
}

这些方法背后的想法是, find将遍历树的层次结构。 并且只要与角色之一匹配, mark就会处理该节点。

这段代码将我们带到了解决方案的一半。 现在,无论使用\\P标记什么内容,我们都有标记的内容ID

现在,我们实际上需要提取与这些ID匹配的渲染指令。

为此,您需要编写自己的IEventListener 此类可以传递给CanvasProcessor ,然后每次解析器完成对指令的处理时都会得到通知。

public void eventOccurred(IEventData iEventData, EventType eventType) {
    if(eventType == EventType.RENDER_TEXT)
    {
        TextRenderInfo tri = (TextRenderInfo) iEventData;
        int mcID = tri.getMcid();
        // this is where you can do something with it
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM