我遇到了一个读取PDF文件中表格的问题。这是一个非常简单的PDF文件,包含一些文本和一个表格。我使用的工具是itextsharp。我知道PDF文件中没有表格概念。在经过一些谷歌搜索后,有人说可以通过itextsharp + 自定义ITextExtractionStrategy来实现。但我不知道如何开始。请问有人可以给我一些提示吗?或者提供一小段样例代码?
谢谢!
谢谢!
这段代码用于读取表格内容。所有的值都被()Tj括起来,因此我们查找所有的值,然后你可以对字符串结果进行任何操作。
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(')'));
}
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;
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
}
这是一种更手动的方式,但它可能会很有用。
/// <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;
}
使用:
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"];