C# 从PDF中获取特定图层的文本

C# 从PDF中获取特定图层的文本,c#,C#,这是一个pdf示例,图层上有文本。如果我关闭该层,则属于该层的所有文本也将不可见。 我需要从特定层获取所有文本。任何机构都知道如何将其存档 以下是我的示例PDF文件: 我的代码可以获取所有文本。但我不知道如何获取只属于任何特定层的文本 public CreateHyperLinkButton(string inPutPDF, string outPutPDF, List<ViewPortInfo> ViewportInfos) { using (FileSt

这是一个pdf示例,图层上有文本。如果我关闭该层,则属于该层的所有文本也将不可见。 我需要从特定层获取所有文本。任何机构都知道如何将其存档

以下是我的示例PDF文件:

我的代码可以获取所有文本。但我不知道如何获取只属于任何特定层的文本

public CreateHyperLinkButton(string inPutPDF, string outPutPDF, List<ViewPortInfo> ViewportInfos)
    {

        using (FileStream pdf = new FileStream(outPutPDF, FileMode.Create))
        {
            using (PdfReader pdfReader = new iTextSharp.text.pdf.PdfReader(inPutPDF))
            {
                using (PdfStamper pdfStamper = new iTextSharp.text.pdf.PdfStamper(pdfReader, pdf))
                {
                    //Get Text list on 2D PDF
                    List<TextRenderInfo> listTextInfor = GetAllTextInfor(inPutPDF, pdfReader);

                    listTextInfor.ForEach(item =>{
                        string btnName = item.GetText().Trim();

                        //Check btnName exist in ViewportInfos
                        for (var i = 0; i < ViewportInfos.Count; i++)
                        {
                            string szRes = GetTextContained(ViewportInfos[i].Hyperlinks.Keys.ToList(), btnName);
                            if (!string.IsNullOrEmpty(szRes))
                            {
                                iTextSharp.text.Rectangle box = GetRectOfText(item);
                                iTextSharp.text.pdf.PushbuttonField btnField = new iTextSharp.text.pdf.PushbuttonField(pdfStamper.Writer, box, szRes);
                                iTextSharp.text.pdf.PdfAnnotation pushbutton = btnField.Field;

                                //Add JS function and button in annotation
                                string js = "mapView('" + szRes + "');";
                                pushbutton.SetAdditionalActions(iTextSharp.text.pdf.PdfName.U, iTextSharp.text.pdf.PdfAction.JavaScript(js, pdfStamper.Writer));
                                pdfStamper.AddAnnotation(pushbutton, 1);
                            }
                        }
                    });
                    pdfStamper.Close();
                }
                pdfReader.Close();
            }
            pdf.Close();
        }
    }

    private static List<TextRenderInfo> GetAllTextInfor(string inPutPDF, PdfReader pdfReader)
    {
        List<TextRenderInfo> listTextInfor = new List<TextRenderInfo>();

        TextExtractionStrategy allTextInfo = new TextExtractionStrategy();

        for (int i = 1; i <= pdfReader.NumberOfPages; i++)
        {
            PdfTextExtractor.GetTextFromPage(pdfReader, i, allTextInfo);
        }
        listTextInfor = allTextInfo.textList;
        return listTextInfor;
    }

public class TextExtractionStrategy : ITextExtractionStrategy
{
    public List<TextRenderInfo> textList = new List<TextRenderInfo>();
    public void BeginTextBlock()
    {

    }

    public void EndTextBlock()
    {

    }

    public string GetResultantText()
    {
        return "";
    }

    public void RenderImage(ImageRenderInfo renderInfo)
    {
        var a = renderInfo;
    }

    public void RenderText(TextRenderInfo renderInfo)
    {
        textList.Add(renderInfo);
    }
}
publicCreateHyperlinkButton(字符串输入PDF、字符串输出PDF、列表ViewPortInfo)
{
使用(FileStream pdf=newfilestream(outPutPDF,FileMode.Create))
{
使用(PdfReader PdfReader=new iTextSharp.text.pdf.PdfReader(inPutPDF))
{
使用(PdfStamper PdfStamper=new iTextSharp.text.pdf.PdfStamper(pdfReader,pdf))
{
//获取2D PDF上的文本列表
List listTextInfor=GetAllTextInfor(inPutPDF,pdfReader);
listTextInfor.ForEach(项=>{
字符串btnName=item.GetText().Trim();
//检查ViewPortInfo中是否存在Btname
for(var i=0;i对于(int i=1;i您可以使用此功能。根据他们网站上的文档解析/打开pdf,并在调试中检查,然后您可以开发一些代码,仅从该层检索文本。

请添加更多信息、代码和详细信息,以帮助其他人理解您所做的工作,并为他们提供更多上下文。我修改了问题a我想从特定层获取文本列表,并在该层添加按钮。欢迎使用任何方法和免费库。您检查过此解决方案吗?它使用iTextSharp,我刚刚在您的PDF上尝试过,它显然检索了所有内容。嗨,安德烈·莱莫斯,在该解决方案中,我没有看到层在哪里。在我的PDF示例文件中,我希望所有文本都属于名为“X1 | A-AREA-__;uIden”的层。我需要这个pdf。你应该尝试的是在debug中彻底检查pdf变量的内容,并尝试找出层是如何管理和执行的。这是我的pdf文件:我在尝试提取一些文本时遇到异常,如下所示:无法将“PdfSharp.pdf.PdfName”类型的对象强制转换为“PdfSharp.pdf.PdfDictionary”。我我想这是因为汉字的缘故
public CreateHyperLinkButton(string inPutPDF, string outPutPDF, List<ViewPortInfo> ViewportInfos)
    {

        using (FileStream pdf = new FileStream(outPutPDF, FileMode.Create))
        {
            using (PdfReader pdfReader = new iTextSharp.text.pdf.PdfReader(inPutPDF))
            {
                using (PdfStamper pdfStamper = new iTextSharp.text.pdf.PdfStamper(pdfReader, pdf))
                {
                    //Get Text list on 2D PDF
                    List<TextRenderInfo> listTextInfor = GetAllTextInfor(inPutPDF, pdfReader);

                    listTextInfor.ForEach(item =>{
                        string btnName = item.GetText().Trim();

                        //Check btnName exist in ViewportInfos
                        for (var i = 0; i < ViewportInfos.Count; i++)
                        {
                            string szRes = GetTextContained(ViewportInfos[i].Hyperlinks.Keys.ToList(), btnName);
                            if (!string.IsNullOrEmpty(szRes))
                            {
                                iTextSharp.text.Rectangle box = GetRectOfText(item);
                                iTextSharp.text.pdf.PushbuttonField btnField = new iTextSharp.text.pdf.PushbuttonField(pdfStamper.Writer, box, szRes);
                                iTextSharp.text.pdf.PdfAnnotation pushbutton = btnField.Field;

                                //Add JS function and button in annotation
                                string js = "mapView('" + szRes + "');";
                                pushbutton.SetAdditionalActions(iTextSharp.text.pdf.PdfName.U, iTextSharp.text.pdf.PdfAction.JavaScript(js, pdfStamper.Writer));
                                pdfStamper.AddAnnotation(pushbutton, 1);
                            }
                        }
                    });
                    pdfStamper.Close();
                }
                pdfReader.Close();
            }
            pdf.Close();
        }
    }

    private static List<TextRenderInfo> GetAllTextInfor(string inPutPDF, PdfReader pdfReader)
    {
        List<TextRenderInfo> listTextInfor = new List<TextRenderInfo>();

        TextExtractionStrategy allTextInfo = new TextExtractionStrategy();

        for (int i = 1; i <= pdfReader.NumberOfPages; i++)
        {
            PdfTextExtractor.GetTextFromPage(pdfReader, i, allTextInfo);
        }
        listTextInfor = allTextInfo.textList;
        return listTextInfor;
    }

public class TextExtractionStrategy : ITextExtractionStrategy
{
    public List<TextRenderInfo> textList = new List<TextRenderInfo>();
    public void BeginTextBlock()
    {

    }

    public void EndTextBlock()
    {

    }

    public string GetResultantText()
    {
        return "";
    }

    public void RenderImage(ImageRenderInfo renderInfo)
    {
        var a = renderInfo;
    }

    public void RenderText(TextRenderInfo renderInfo)
    {
        textList.Add(renderInfo);
    }
}