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