Converter PDF ou FDF em CSV?

4

Parece loucura, mas enquanto o Libre Base pode exportar um formulário como PDF, não há como importar os dados completos do formulário do PDF para o Libre Base.

Uma ideia é extrair dados de formulários em PDF para o FDF (ou CSV não amigável) e depois convertê-los em um CSV amigável, no qual é possível copiar e colar dados CSV no Libre Base.

  • Como posso converter um arquivo CSV em PDF, FDF ou não amigável em um CSV amigável com:
    • Linha 1: "FieldName1, FieldName2, ..."
    • Linha 2: "Valor1, Valor2, ..."

Arquivos úteis em Ge.tt até 2015.02,25 :

  1. Super blank pdf em branco com "Submit format" como FDF
    • Libre Base > Formulários > Editar > Objeto de banco de dados aberto - > Arquivo > Exportar como PDF
  2. PDF preenchido feito de (1)
    • Digite dados manualmente
  3. Dados CSV extraídos de (2)
    • pdftk filled_form-submit_format_fdf.pdf dump_data_fields output filled_form.csv
  4. Dados FDF extraídos de (2)
    • pdftk filled_form-submit_format_fdf.pdf generate_fdf output filled_form.fdf

* Nota: Você também pode usar o Libre Base para exportar um formulário em branco como XML ou HTML, mas não sei como inserir dados nesses arquivos nem importar esses dados de volta para o Base.

    
por jtd 26.01.2015 / 04:31

2 respostas

5

Como converter FDF em CSV?

Opção A:

awk -F "[()]" '{ if ($1=="/V ") value[$2];} \
    END {printf( "CompanyName\tEmailAddress\t\tCountryOrRegion\n" ); \
           for (x in value)printf("%s\t", x);print "" ; \
    }' filled_form.fdf > filled_form.CSV

Opção B:

grep -oP '(?<=\/T \(txt).*(?=\))' filled_form.fdf |awk '{ORS=(NR%3?",":RS)}1'; \
grep -oP '(?<=\/V \().*(?=\))' filled_form.fdf |awk '{ORS=(NR%3?",":RS)}1'; 

Versão resumida do comando acima seria:

paste -sd, <(grep -oP '(?<=\/T \(txt).*(?=\))' filled_form.fdf) <(grep -oP '(?<=\/V \().*(?=\))' filled_form.fdf)

Opção C:

awk 'NR%2==0{type[$0]} NR%2{value[$0]} END{for (x in type)printf("%s\t", x);print "" ;for (y in value)printf("%s\t", y);print "" ;}' <(grep -oP '(?<=\/T \(txt|\/V \().*(?=\))' filled_form.fdf)

Como converter CSV não amigável em CSV amigável?

Opção A:

awk -F: '{ if ($1=="FieldValue") value[$2];} \
    END {printf( "CountryOrRegion\tCompanyName\tEmailAddress\n" ); \
           for (x in value)printf("%s\t", x) ;print ""; \
    }' filled_form.csv > friendly_filled_form.CSV

Opção B:

grep -oP '(?<=FieldName: txt).*' filled_form.csv |awk '{ORS=(NR%3?",":RS)}1'; \
grep -oP '(?<=FieldValue: ).*' filled_form.csv |awk '{ORS=(NR%3?",":RS)}1'

* Note que este comando é um linear. então, para executá-lo, você precisa digitar / copiar ambas as linhas.

E a versão curta para este seria:

paste -sd, <(grep -oP '(?<=FieldName: txt).*' filled_form.csv) <(grep -oP '(?<=FieldValue: ).*' filled_form.csv)

Opção C:

awk 'NR%2{type[$0]} NR%2==0{value[$0]} END{for (x in type)printf("%s\t", x);print "" ;for (y in value)printf("%s\t", y);print "" ;}' <(grep -oP '(?<=FieldName: txt|FieldValue: ).*' filled_form.csv)

ou até mesmo este:

awk 'NR%2{type[$0]} NR%2==0{value[$0]} END{for (x in type)printf("%s\t", x);print "" ;for (y in value)printf("%s\t", y);print "" ;}' <(awk -F'FieldValue: |FieldName: txt' 'NF>1{print $2}' filled_form.csv)

Como converter PDF para CSV?

Eu completarei a solução com pdfgrep amanhã, mas se você quiser experimentar por si mesmo, aqui está o comando:

pdfgrep 'CompanyName|CountryOrRegion|EmailAddress' filled_form-submit_format_fdf.pdf

Ele precisa trabalhar no formato de saída. Se você deseja obter apenas palavras inteiras, use a opção -C 0 . boa sorte e espero ajuda;)

    
por devWeek 27.01.2015 / 22:02
3

Respondendo especialmente ao seu comentário aqui:

% bl0ck_qu0te%

Não, é não razoável esperar que qualquer programa seja capaz de ler um PDF gerado, não mais do que esperar que uma impressora seja capaz de se movimentar de volta uma folha que acabou de ser impressa e devolvendo o seu documento.

PDF é um formato de impressão / arquivamento. É basicamente (1) uma série de instruções do tipo de "colocar a palavra olá na posição x, y na página". Então, quando você vê em um PDF:

Não há como um programa de computador dizer se são duas linhas por três colunas ou duas linhas por duas colunas contendo espaços (2). O número 3 poderia ser um 2,95 arredondado, mesmo. Você não pode saber porque a informação simplesmente não está lá. Então, você nunca acha que voltar do PDF para os seus dados deveria ser possível (3).

No entanto , você pode tentar converter as informações em coisas mais gerenciáveis, por exemplo, pdftotext (4):

[romano:~/tmp] 1 % pdftotext Untitled1.pdf; cat Untitled1.txt
Sheet1

shiny
mint

new
used

3
1

Page 1

... e, em seguida, use scripts, edição manual, qualquer coisa para massagear.

Notas de rodapé:

(1) realmente, realmente eufemismo aqui.

(2) É 2 por 2, na verdade.

(3) Eu vi até mesmo PDFs onde o programa de criadores foi longos trechos para tornar isso quase impossível, colocando cada glifo independentemente e aleatoriamente na página, para dificultar a sua manipulação. Não, não consigo mais encontrar o exemplo ...

(4) do pacote poppler-utils

    
por Rmano 27.01.2015 / 09:17