我在从pdf文件中读取表时遇到问题。这是一个非常简单的pdf文件,包含一些文本和表格。我使用的工具是itextsharp。我知道PDF中没有表格概念。经过一些谷歌搜索后,有人说可能使用itextsharp + custom ITextExtractionStrategy实现这一目标。但我不知道如何开始它。有人可以给我一些提示吗?还是一小段示例代码?
干杯
答案 0 :(得分:3)
此代码用于读取表格内容。所有的值都被()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(')'));
}
答案 1 :(得分:1)
此代码仅用于阅读您需要的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
}
答案 2 :(得分:0)
看看IvyPdf:www.ivytools.net 它可以识别和提取PDF中的表格,以及任何其他信息。它可以免费供个人使用。
答案 3 :(得分:0)
这是一种更为手动的方法,但它可能很有用。
/// <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"];