【问题标题】:How to read table from PDF using itextsharp?如何使用 itextsharp 从 PDF 中读取表格?
【发布时间】:2013-03-18 18:43:14
【问题描述】:

我在从 pdf 文件中读取表格时遇到问题。这是一个非常简单的 pdf 文件,带有一些文本和一个表格。我使用的工具是 itextsharp。我知道 PDF 中没有表格概念。经过一番谷歌搜索,有人说可以使用 itextsharp + 自定义 ITextExtractionStrategy 来实现。但我不知道如何开始。有人可以给我一些提示吗?还是一小段示例代码?

干杯

【问题讨论】:

  • 由于您没有提供样本PDF,您的问题只能笼统地回答。因此,如果您真的只想阅读一个特定的表格(或特定类型的表格),您可能需要提供一个示例 PDF 来获得特定的答案。
  • 查看这篇文章和里面的链接stackoverflow.com/a/7515625/231316

标签: pdf itext


【解决方案1】:

这是一种更手动的方式,但它可能很有用。

    /// <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"];

【讨论】:

  • 你完全解析同一个页面很多次,每次都提取它的不同部分。这比仅将其解析为常规的LocationTextExtractionStrategy 然后通过调用LocationTextExtractionStrategy.getResultantText(TextChunkFilter) 并分别匹配TextChunkFilter 来检索这些不同页面区域的内容要花费更长的时间。在与 iText 7 类似的上下文中,该开关进行了提取 87.6 times faster...
【解决方案2】:

此代码用于读取表格内容。所有的值都被 ()Tj 包围,所以我们寻找所有的值,然后你可以用字符串 resulst 做任何事情。

    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(')'));
    }

【讨论】:

    【解决方案3】:

    此代码仅用于阅读您需要的 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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-28
      相关资源
      最近更新 更多