Dados PDF e raspagem de tabela para Excel

Estou a tentar descobrir uma boa maneira de aumentar a produtividade do meu trabalho de introdução de dados.

o que estou a tentar fazer é arranjar uma forma de raspar dados de um PDF e introduzi-los no Excel.

Mais especificamente, os dados com que estou a trabalhar são de folhetos de mercearia. Tal como está agora, temos de introduzir manualmente todos os negócios no panfleto numa base de dados. Uma amostra de um folheto é http://weeklyspecials.safeway.com/customer_Frame.jsp?drpStoreID=1551

o que eu espero fazer é ter colunas para produtos, preço e opções predefinidas (cartões de fidelidade, cupões, variedade selecionada... esse tipo de coisa).

Qualquer ajuda seria apreciada, e se precisar de ser mais específica, avise-me.

Author: Trenton McKinney, 2015-04-25

1 answers

Depois de olhar para o PDF específico ligado pelo po, devo dizer que este não é um formato de tabela típico.

Contém muitas imagens dentro das "células" , mas as células não estão todas estritamente alinhadas verticalmente ou horizontalmente:

Page 6 from the PDF linked in the OP

Então, esta nem sequer é uma mesa "bonita", mas uma extremamente feia e estranha para se trabalhar...
Dito isto, tenho de acrescentar: A extrair até o "bom" os quadros de PDFs em geral são extremamente difíceis...

Os PDFs padrão não dão quaisquer dicas sobre a semântica do que eles desenham numa página: a única distinção que a sintaxe fornece é a distinção entre elementos vetoriais (linhas, preenche,...), imagens e texto.

Se algum carácter faz parte de uma tabela ou de uma linha ou apenas de um carácter isolado dentro de uma área de outra forma vazia, não é fácil reconhecer programaticamente analisando o código fonte PDF.

Para um fundo sobre o porquê do formato de arquivo PDF nunca, nunca deve ser pensado como adequado para hospedar dados extraíveis, estruturados, ver este artigo:

Por que atualizar dólares para Docs foi tão difícil (ProPublica-Website)

...mas fazê-lo com TabulaPDF funciona muito bem!

[7]tendo dito o acima agora deixe-me adicionar isto:

O Extractor Tabula está escrito em Ruby. No fundo, ele faz uso de PDFBox (que é escrito em Java) e algumas outras bibliotecas de terceiros. Para executar, o Tabula-Extractor necessita de JRuby-1.7 instalado.


A Instalar O Tabula-Extractor

Estou a usar a versão' bleeding-edge ' de Tabula-Extractor directamente do seu repositório de código-fonte GitHub. Pô-lo a funcionar foi extremamente fácil, uma vez que no meu sistema JRuby-1.7.4_0 já está presente:

mkdir ~/svn-stuff
cd ~/svn-stuff
git clone https://github.com/tabulapdf/tabula-extractor.git git.tabula-extractor

Incluído neste clone do Git já serão as bibliotecas necessárias, por isso não é necessário instalar o PDFBox. A ferramenta da linha de comandos está na sub-pasta /bin/.

A explorar as opções da linha de comandos:

~/svn-stuff/git.tabula-extractor/bin/tabula -h

Tabula helps you extract tables from PDFs

Usage:
       tabula [options] <pdf_file>
where [options] are:
         --pages, -p <s>:   Comma separated list of ranges, or all. Examples:
                            --pages 1-3,5-7, --pages 3 or --pages all. Default
                            is --pages 1 (default: 1)
          --area, -a <s>:   Portion of the page to analyze
                            (top,left,bottom,right). Example: --area
                            269.875,12.75,790.5,561. Default is entire page
       --columns, -c <s>:   X coordinates of column boundaries. Example
                            --columns 10.1,20.2,30.3
      --password, -s <s>:   Password to decrypt document. Default is empty
                            (default: )
             --guess, -g:   Guess the portion of the page to analyze per page.
             --debug, -d:   Print detected table areas instead of processing.
        --format, -f <s>:   Output format (CSV,TSV,HTML,JSON) (default: CSV)
       --outfile, -o <s>:   Write output to <file> instead of STDOUT (default:
                            -)
       --spreadsheet, -r:   Force PDF to be extracted using spreadsheet-style
                            extraction (if there are ruling lines separating
                            each cell, as in a PDF of an Excel spreadsheet)
    --no-spreadsheet, -n:   Force PDF not to be extracted using
                            spreadsheet-style extraction (if there are ruling
                            lines separating each cell, as in a PDF of an Excel
                            spreadsheet)
            --silent, -i:   Suppress all stderr output.
  --use-line-returns, -u:   Use embedded line returns in cells. (Only in
                            spreadsheet mode.)
           --version, -v:   Print version and exit
              --help, -h:   Show this message

A extrair a mesa que a OP quer

Nem sequer estou a tentar extrair esta mesa feia da OP's monster PDF.Vou deixar isto como um exercício para estes leitores que se sentem aventureiros o suficiente...

Em vez disso, vou mostrar como extrair uma mesa "bonita". Vou tirar as páginas 651-653 da oficial PDF-1.7 Especificação, aqui representado com imagens:

Pages 651-653 of the official PDF-1.7 specification

Usei este comando:

 ~/svn-stuff/git.tabula-extractor/bin/tabula \
   -p 651,652,653 -g -n -u -f CSV            \
    ~/Downloads/pdfs/PDF32000_2008.pdf
Depois de importar o CSV gerado para o LibreOffice Calc, a folha de cálculo parece isto:

Screenshot from LibreOffice after importing the CSV

Para mim, isto parece-me a extracção perfeita de uma tabela que se espalhou por 3 páginas diferentes em PDF. (até as novas linhas utilizadas nas células da tabela o transformaram na folha de cálculo.)

Actualizar

Aqui está um screencast ASCiinema (que você também pode obter e reproduzir localmente no seu terminal Linux / MacOSX / Unix com a ajuda da ferramenta da linha de comandos asciinema, estrelando tabula-extractor:

 26
Author: Kurt Pfeifle, 2015-07-01 03:52:10