Dados PDF e raspagem de tabela para Excel
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=1551o 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.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:
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:- Para uma incrível família de código aberto ferramentas que melhoram e melhoram de semana em semana para extrair dados tabulares de PDFs (a menos que sejam páginas digitalizadas)) -- contradizendo o que eu disse nos meus parágrafos introdutórios! -- confira TabulaPDF. Ver estes links:
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: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:
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 comandosasciinema
, estrelando tabula-extractor
: