Como comparar vários (milhares) de PDFs?

1

Eu tenho duas coleções de PDFs. Um ( collection1 ) é de mais de 1000 PDFs, muito maiores em tamanho de arquivo (100 + GB), e em seções ilógicas (pense no pdf 1 (1), 1 (3), ... e deve ser apenas um arquivo). O outro ( collection2 ) é de 300 arquivos.

A Collection2 deve ser uma versão compactada e organizada da coleção1. Eu usei o Adobe Acrobat para processar, condensar vários PDFs em um único PDF e aplicar a compactação ( e numeração de bates). Depois de fazer alguns, tive uma equipe júnior assumindo ...

E descobrimos recentemente que existem erros. Seções faltando em comparação com os PDFs originais e problemas semelhantes. Isso é um grande erro e algo que espero poder consertar facilmente.

Não tenho certeza se o que estou procurando neste caso é realmente diff , pois preciso comparar vários arquivos em um único arquivo.

Se eu pudesse isolar os arquivos com problema, poderia consertá-los facilmente. O melhor que posso imaginar agora é surpreendentemente Preview (MacOS), que permite abrir vários conjuntos de arquivos (e fornece contagem de páginas). De lá, posso verificar primeiro, último e vários no meio. Se elas forem consistentes e a contagem de páginas for consistente, é provável que os arquivos sejam sólidos, pelo que posso dizer dos erros. Esta não é a solução mais completa, no entanto.

Respostas para perguntas semelhantes são aqui e aqui , no entanto, eles são vários anos de idade, janelas específicas (o que é bom se necessário, mas não é preferido neste caso particular), ou não na escala que eu preciso para operar em. Ninguém na minha equipe possui habilidades técnicas avançadas, relativas à comunidade de SU, portanto, uma resposta detalhada ou links para um conhecimento pré-requisito relevante seria muito, muito apreciada.

Muito obrigado SU

    
por Gryph 13.11.2017 / 22:12

2 respostas

1

Você precisa primeiro de alguma maneira mapear os 1000 arquivos com os 300 arquivos, em ordem.

No caso mais simples, você dirá "CIDOC Ontology 2.0 (1) .pdf", "CIDOC Ontology 2.0 (2) .pdf" e "CIDOC Ontology 2.0 (3) .pdf", por um lado, e " CIDOC ontology.pdf "por outro.

Agora, as melhores abordagens que posso imaginar são:

  1. Usando pdftk ou pdf2json , extraia o número de páginas do grupo 1000 e veja se a soma corresponde ao grupo 300:

    12, 9, 10  vs.   31   = OK
    12, 9, 10  vs    22   = BAD (and you might suspect section 2 is missing)
    

    Este método é bastante básico e não reconhece três seções que estão fora de ordem.

  2. Usando pdf2ps e ps2ascii , crie versões em texto de todos os arquivos. Dependendo do processo de PDF, eles podem estar quase ilegíveis, mas pouco importa: com um pouco de sorte, a ferramenta usada para aglutinar os arquivos não terá alterado as métricas de texto e o agrupamento. Se for assim, então a concatenação dos três arquivos será muito, muito parecida com o quarto arquivo (e se não, você o marcará como uma anomalia). Então, essas heurísticas devem funcionar:

    • a soma das saídas de "wc" dos três arquivos será igual (ou muito próxima) da saída do quarto arquivo.
    • cat'ting os três arquivos de texto, ou o quarto arquivo, através de  cat file1 file2 file3 | sed -e "s # \ s # \ n # g" | ordenar deve produzir listas de palavras quase idênticas (a saída de diff -Bbawd deve ser não mais do que três ou quatro linhas; idealmente, nenhuma). Se você omitir o estágio | sort , as seções fora de ordem deverão ser reconhecíveis: se a verificação classificada corresponder e a não classificada não, você estará enfrentando uma situação fora da ordem.

A parte sed dividirá as palavras, o que pode ajudar mesmo que a ferramenta de coalescer altere o texto de alguma forma. Uma mudança no kerning, com as palavras se dividindo diferentemente dentro do PDF ("homeostase" tendo se tornado "ho meos tas is" de "home osta sis"), tornará isso insuficiente; mas não é tão provável.

A dificuldade que vejo é combinar os arquivos raw com o final. Tendo uma amostra de cada um, eu provavelmente poderia preparar um script para executar a comparação.

    
por 13.11.2017 / 23:47
1

Você poderia usar um processo de alinhamento de seqüência semelhante à análise de sequência de DNA. Especificamente, uma abordagem de programação dinâmica para alinhamento de seqüências.

Extraia o texto de cada PDF em cada coleção e tente alinhar cada sequência de texto individual da Coleção 1 com cada sequência concatenada mais longa da Coleção 2. A correspondência perfeita de qualquer letra obtém uma pontuação de um e as incompatibilidades obtêm um zero . A pontuação geral é o número de correspondências entre seqüências alinhadas. Você também pode permitir edições entre sequências, mas introduzindo lacunas.

O algoritmo não é difícil, mas pode demorar um pouco para ser executado. Dado o tamanho do conjunto de dados que você mencionou, acredito que seja executado em algumas horas ou durante a noite.

Aqui está um link para o algoritmo na Wikipédia: link

    
por 28.11.2017 / 14:52