如何使用itextsharp从PDF中读取表格?
我在从pdf文件中读取表格时遇到问题。这是一个非常简单的pdf文件,包含一些文本和一个表格。我正在使用的工具非常锋利。我知道PDF中没有表格概念。在谷歌搜索之后,有人说使用itextsharp+自定义iTextractionStrategy可能实现这一目标。但我不知道怎么开始。有人能给我一些提示吗?还是一小段示例代码如何使用itextsharp从PDF中读取表格?,pdf,itext,Pdf,Itext,我在从pdf文件中读取表格时遇到问题。这是一个非常简单的pdf文件,包含一些文本和一个表格。我正在使用的工具非常锋利。我知道PDF中没有表格概念。在谷歌搜索之后,有人说使用itextsharp+自定义iTextractionStrategy可能实现这一目标。但我不知道怎么开始。有人能给我一些提示吗?还是一小段示例代码 干杯此代码仅用于阅读您需要的PDF文件 using iTextSharp.text.pdf; using iTextSharp.text.pdf.parser; 从dll ite
干杯此代码仅用于阅读您需要的PDF文件
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;
从dll itextsharp.dll
var pdfReader = new PdfReader(_filePath);
for (int i = 0; i < pdfReader.NumberOfPages; i++)
{
var locationTextExtractionStrategy = new LocationTextExtractionStrategy();
string textFromPage = PdfTextExtractor.GetTextFromPage(pdfReader, i + 1, locationTextExtractionStrategy);
textFromPage = Encoding.UTF8.GetString(Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(textFromPage)));
//Do Something with the text
}
var-pdfReader=新的pdfReader(\u文件路径);
对于(int i=0;i
此代码用于读取表格内容。所有的值都用()Tj括起来,所以我们查找所有的值,然后可以使用字符串result执行任何操作
string _filePath = @"~\MyPDF.pdf";
public List<String> Read()
{
var pdfReader = new PdfReader(_filePath);
var pages = new List<String>();
for (int i = 0; i < pdfReader.NumberOfPages; i++)
{
string textFromPage = Encoding.UTF8.GetString(Encoding.Convert(Encoding.Default, Encoding.UTF8, pdfReader.GetPageContent(i + 1)));
pages.Add(GetDataConvertedData(textFromPage));
}
return pages;
}
string GetDataConvertedData(string textFromPage)
{
var texts = textFromPage.Split(new[] { "\n" }, StringSplitOptions.None)
.Where(text => text.Contains("Tj")).ToList();
return texts.Aggregate(string.Empty, (current, t) => current +
t.TrimStart('(')
.TrimEnd('j')
.TrimEnd('T')
.TrimEnd(')'));
}
string\u filePath=@“~\MyPDF.pdf”;
公共列表读取()
{
var pdfReader=新的pdfReader(_filePath);
var pages=新列表();
对于(int i=0;itext.Contains(“Tj”)).ToList();
返回文本.Aggregate(string.Empty,(current,t)=>current+
t、 TrimStart(“(”)
.TrimEnd('j')
.TrimEnd('T')
.TrimEnd(“)”);
}
这是一种更为手动的方法,但也很有用
/// <summary>
/// Lê uma tabela de um pdf
/// </summary>
/// <param name="pdf">Caminho do PDF</param>
/// <param name="origemXPag1">Inicio da leitura no eixo X para a primeira página</param>
/// <param name="origemYPag1">Inicio da leitura no eixo Y para a primeira página</param>
/// <param name="linhasPag1">Quantidade de linhas da primeira página</param>
/// <param name="origemXOutrasPag">Inicio da leitura no eixo X para as demais páginas</param>
/// <param name="origemYOutrasPag">Inicio da leitura no eixo Y para as demais páginas</param>
/// <param name="linhasOutrasPag">Quantidade de linhas das demais páginas</param>
/// <param name="alturaLinha">Altrura da linha</param>
/// <param name="colunas">Nome e largura das colunas</param>
/// <returns></returns>
private static List<Dictionary<string, string>> LerTabelaPDF(string pdf, float origemXPag1, float origemYPag1, int linhasPag1, float origemXOutrasPag, float origemYOutrasPag, int linhasOutrasPag, float alturaLinha, Dictionary<string, float> colunas)
{
// Primeira página
float origemX = origemXPag1;
float origemY = origemYPag1;
int quantidadeLinhas = linhasPag1;
var resultado = new List<Dictionary<string, string>>();
using (PdfReader leitor = new PdfReader(pdf))
{
var texto = string.Empty;
for (int i = 1; i <= leitor.NumberOfPages; i++)
{
if (i > 1)
{
origemX = origemXOutrasPag;
origemY = origemYOutrasPag;
quantidadeLinhas = linhasOutrasPag;
}
for (int l = 0; l < quantidadeLinhas; l++)
{
var dados = new Dictionary<string, string>();
int c = 0;
float deslocamentoX = 0;
foreach (var coluna in colunas)
{
RectangleJ rect = new RectangleJ(origemX + deslocamentoX, origemY + (l * alturaLinha), coluna.Value, alturaLinha);
RenderFilter filter = new RegionTextRenderFilter(rect);
ITextExtractionStrategy strategy = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), filter);
texto = PdfTextExtractor.GetTextFromPage(leitor, i, strategy);
dados.Add(coluna.Key, texto);
c++;
deslocamentoX += coluna.Value;
}
if (dados != null)
resultado.Add(dados);
}
}
}
return resultado;
}
//
///Lêuma tabela de um pdf
///
///卡米尼奥
///没有埃克索,也没有帕吉纳
///我不知道该怎么做
///帕吉纳初级学校数量
///我不知道该怎么做
///我不知道你是谁
///林哈斯的数量是páginas
///阿尔特鲁拉达林哈酒店
///诺姆·拉古拉·达斯·科鲁纳斯
///
私有静态列表LerTabelaPDF(字符串pdf、浮点OrigmXPAG1、浮点OrigmYPAG1、int-linhasPag1、浮点OrigmXOutraspag、浮点OrigmYoutRaspag、int-linhasOutrasPag、浮点alturaLinha、字典colunas)
{
//普里梅拉·帕吉纳
浮点数origemX=origemXPag1;
浮动原点=origemYPag1;
int quantidadelihas=linhasPag1;
var resultado=新列表();
使用(PdfReader leitor=新PdfReader(pdf))
{
var texto=string.Empty;
对于(int i=1;i 1)
{
origemX=origemXOutrasPag;
origemY=origemYOutrasPag;
QuantidaDeliHas=linhasOutrasPag;
}
对于(int l=0;l
使用:
var colunas = new Dictionary<string, float>();
colunas.Add("cod", 20);
colunas.Add("desc", 300);
var registros = LerTabelaPDF(pdf, 19, 75, 9, 19, 40, 13, 40, colunas);
var cod = registros[0]["cod"];
var colunas=newdictionary();
添加(“cod”,20);
添加(“说明”,300);
var registros=LerTabelaPDF(pdf,19,75,9,19,40,13,40,colunas);
var cod=registros[0][“cod”];
由于您没有提供PDF样本,您的问题只能得到一般性的回答。因此,如果你真的只想阅读一个特定的表格(或一种特定的表格),你可能需要提供一个PDF样本来获得特定的答案。请参阅本文及其链接,你可以多次完整地解析同一页面,每次都可以提取其中的不同部分。这比只将其解析一次到常规的LocationTextExtractionStrategy
中,然后通过调用LocationTextExtractionStrategy.getResultantText(TextChunkFilter)
分别匹配TextChunkFilter
来检索这些不同页面区域的内容要长得多。在与iText 7类似的上下文中,该开关进行了提取。。。