Como visualizar e editar o código de um arquivo PDF

11

Eu queria saber como visualizar e editar o código de um arquivo PDF?

  1. Ao visualizar, não quero ver o formato binário, então acho que hexdumppode não ser o que quero. Eu tentei gedit, mas nenhum método de codificação pode ser usado para decodificar o conteúdo do PDF.

  2. Ao editar, gostaria de procurar /Fite alterá-los para, /XYZpor exemplo, sed. Mas meu comando sed s/\/Fit/\/XYZ/ < 1.pdf > 2.pdfparece não alterar a aparência do meu PDF como eu esperava, embora não relate nenhum erro. Eu queria saber se sedpode realmente funcionar em arquivos PDF como se fossem texto sem formatação?

O contexto das minhas perguntas pode ser encontrado nesta pergunta . Meu sistema operacional é o Ubuntu 10.10.

Tim
fonte

Respostas:

9

Você pode usar sedcom arquivos binários (pelo menos GNU sed; algumas implementações podem ter problemas com arquivos que contêm caracteres nulos ou que não terminam com um caractere de nova linha). Mas o comando que você usou substitui apenas a primeira ocorrência de /Fitcada linha, e as linhas são praticamente sem sentido em um arquivo PDF. Você precisa substituir todas as ocorrências:

 sed s/\/Fit/\/XYZ/g

Seria mais robusto substituir apenas /Fitse não for seguido por um constituinte de palavras (por exemplo, não substituindo /Fitness; não sei se o seu arquivo contém ocorrências /Fitque causariam problemas). Aqui está uma maneira:

perl -pe 's!/Fit\b!/XYZ!g'
Gilles 'SO- parar de ser mau'
fonte
Obrigado! Agora funciona! (1) Eu queria saber como caracteres de pesquisa sed no conteúdo binário? O sed primeiro codifica os caracteres da consulta antes da pesquisa? (2) No último comando, o que faz !, \be gquer dizer? Isso pode ser feito sem o perl apenas com o sed?
Tim
1
@ Tim (1) O Sed carrega os dados na memória, opera com eles e os imprime. Por que precisaria codificar alguma coisa? (2) gsignifica substituir todas as ocorrências em cada linha, tanto em sed quanto em perl. !é o separador; você pode escolher (quase) qualquer caractere como separador para o scomando (isso ocorre tanto em sed quanto em perl). \bsignifica um limite de palavras; existe em perl mas não em sed.
Gilles 'SO- stop be evil'
Sobre (1), porque os caracteres que você atribui ao comando sed são legíveis por humanos. Se o conteúdo a ser pesquisado é completamente binário, como o sed pode encontrar a palavra de consulta lá?
Tim
@ Tim Text são dados binários que são legíveis por humanos.
Gilles 'SO- stop be evil' '
1
@ Tim Sim, você pode passar dados binários na consulta. Você precisará inserir os caracteres literalmente no seu código-fonte sed ou shell.
Gilles 'SO- stop be evil'
16

Em relação à sua 1ª pergunta ("visualizando o código-fonte, mas não o binário"): existem algumas opções que você tem para descompactar os fluxos binários internos que estão anexados a muitos objetos.

Minha ferramenta favorita para isso é o QPDF , disponível em todas as principais plataformas de sistemas operacionais. O comando a seguir descompacta todos os fluxos e todos os fluxos de objetos:

 qpdf --qdf --object-streams=disable orig.pdf expanded.pdf

Agora você pode abrir seu PDF em qualquer editor de texto. (Ainda pode haver alguns blobs binários: por exemplo, arquivos de fonte e perfis ICC, o que não faria sentido expandir o QPDF).

Para re-comprimir o expanded.pdfnovamente após a edição, você pode executar:

 qpdf expanded.pdf orig2.pdf

(Cuidado ao editar PDFs manualmente! Você precisa saber muito sobre a sintaxe interna deles para fazer isso corretamente. Assim que você adicionar ou excluir um único byte, poderá receber mensagens de erro de leitores de PDF que talvez não consigam mais abra-o, porque o sumário interno do PDF está corrompido, o que é baseado em cálculos de desvio de bytes. A substituição Fitpor XYZseqüências de caracteres deve funcionar bem ...)

Kurt Pfeifle
fonte
1
Você também pode adicionar ou remover texto. Quando o comprimento de um fluxo de objetos muda, os desvios de bytes podem ser recalculados usando o fix-qdfprograma que faz parte do qpdf. Você ainda precisa ter um pouco de cuidado. Veja qpdf.sourceforge.net/files/qpdf-manual.html#ref.qdf
H. Rittich
@ H.Rittich: Agradecemos pelo comentário ... De que maneira você acha que isso abre uma nova perspectiva sobre o problema? Você acha que não sabemos que podemos adicionar ou remover texto dessa maneira?
Kurt Pfeifle #
@ KursPfeifle: Eu não faço nenhuma suposição sobre o que você sabe. A resposta afirma que a edição de um PDF dessa maneira precisa preservar as compensações de bytes dos objetos no arquivo. No entanto, é possível alterar as compensações de bytes quando posteriormente corrigi-las usando fix-qdf. Portanto, se você deseja substituir uma sequência por outra de comprimento diferente, é possível, mas é necessário usar a fix-qdfferramenta. Eu diria que esta é uma adição útil à resposta.
H. Rittich 10/10/19
@ H.Rittich: Thx por dar sua perspectiva. Quando enfatizei a necessidade de preservar desvios de bytes de objetos, não queria aconselhar as pessoas sobre COMO elas deveriam fazer isso. Se você tivesse redigido seu comentário de maneira um pouco diferente, eu entenderia a intenção do seu comentário mais rapidamente.
Kurt Pfeifle #
1

sedé orientado a linhas, o que o torna inadequado para arquivos binários, estruturados como blocos e não linhas.
Tente usar o bbe (bbe-.sourceforge.net).

Como alternativa, o Emacs (GNU e XEmacs) e o vim abrem arquivos PDF sem problemas. É claro que não é muito bonito, pois é um texto misto e binário, mas é suficiente para os propósitos de edição.
Existe um plugin Pdftk para vim que facilita tudo, faça o download aqui (arquivo zip).
Como você provavelmente sabe, os dois editores acima têm recursos avançados de pesquisa e substituição.

Além disso, a conversão do PDF para o modo QDF antes facilita a edição de arquivos PDF.

Philomath
fonte
Você também pode tentar editar sedusando o -bswitch. se funcionar, adicionarei isso à minha resposta.
Philomath 22/07
@ Tim: o que você quer dizer com "não mostra nada", apenas vazio? alguma mensagem de erro? Além disso, você pode tentar com o XEmacs? (os três trabalharam para mim).
Philomath 22/07
Não importa -b, é específico para cygwin.
Philomath 22/07
O Emacs diz "O arquivo 1.pdf é grande (9MB), está realmente aberto? (S ou n)". Eu escolhi "y" e depois nada está lá.
Tim
Provavelmente é um problema do Emacs, você tem o XEmacs? (Acabei de abrir um PDF de 31 MB sem problemas).
Philomath 22/07
0

Use o LibreOffice ou o OpenOffice para abrir o PDF, visualizá-lo, substituir itens, escrever um novo PDF, etc. Acho que você pode usá-lo a partir da linha de comando ou programaticamente se houver muitos documentos para processar.

Observe que PDFs de algumas fontes, por exemplo, scanners, geralmente contêm as páginas como imagens e não como texto, para que você não tenha sorte com o uso de pesquisa e substituição.

Steve Barnes
fonte
3
(1/2) Esteja ciente do seguinte fato: O LibreOffice não é um editor de PDF nativo. Quando abre um PDF, converte todas as páginas em uma imagem vetorial (que pode manter as partes rasterizadas do PDF original como partes rasterizadas) e abre-o na parte do LibreOffice Draw da suíte LibreOffice. Em seguida, quando ele salvar o arquivo PDF editado, ele será exportado do formato nativo do LibreOffice Draw (com o sufixo .odg ) para PDF.
Kurt Pfeifle
3
(2/2) Esse fluxo de trabalho pode ter efeitos colaterais inesperados. Além disso, o aplicativo LibreOffice Draw pode não conseguir importar corretamente todos os elementos do PDF original. No entanto, em muitos casos, ainda pode ser uma ferramenta útil para todas as pessoas que não têm melhores meios disponíveis.
Kurt Pfeifle