Gerar ou atualizar um PDF para incluir uma marca d'água oculta e criptografada?


10

fundo

Usando o LaTeX para escrever um livro. Quando um usuário compra o livro, o PDF é gerado automaticamente.

Problema

O PDF deve ter uma marca d'água que inclua o nome e as informações de contato da pessoa.

Pergunta, questão

Qual software atende aos seguintes critérios:

  • Aplica marcas d'água invisíveis e criptografadas em um PDF
  • Código aberto
  • Independente da plataforma (Linux, Windows)
  • Rápido (marca um PDF de 200 páginas em menos de 1 segundo)
  • Processamento em lote (exclusivamente orientado por linha de comando)
  • Resistente a ataques de conluio
  • Não frágil (por exemplo, PDF -> EPS -> PDF ainda contém a marca d'água)
  • Bem documentado (mostra exemplos de usos)

Ideias e Recursos

Algumas reflexões e conclusões:

O problema com a PNL é que erros gramaticais podem ser introduzidos. O problema com a esteganografia é que as imagens são originadas de um cache de imagens e, portanto, a recriação desse cache com imagens com marca d'água dará um atraso na geração do PDF (eu poderia excluir uma imagem do cache, mas essa não é uma solução elegante).

Obrigado!


Modifique um pouco sua descrição dos requisitos, caso contrário eles não serão claros. "marcas d'água indetectáveis" claramente não são o que você deseja ... caso contrário, como você as detectaria se precisasse?
Kurt Pfeifle,

Não está claro qual é exatamente o objetivo do seu sistema concebido: Detectar se o PDF é repassado a outro usuário, mesmo que sua licença proíba isso? Detectar se o PDF é impresso em papel, mesmo que sua licença proíba isso? Acompanhar o caminho de um PDF específico pela Internet e acompanhar quando ele é aberto? Ou alguma outra coisa?
Kurt Pfeifle,

@pipitas: se uma versão registrada do PDF for lançada, sem permissão, para a natureza, eu gostaria de saber quem a lançou. Mas se as pessoas puderem ver que o PDF tem uma marca d'água, ela se tornará muito mais fácil de contornar.
Dave Jarvis

Respostas:


6

Eu fiz algo semelhante há alguns anos atrás. Não atendeu a todos os seus critérios "rígidos". Funcionou assim:

  • Coloquei uma área "clicável" dificilmente detectável e com tamanho de ponto 2x2 em algum lugar aleatório em uma das bordas de uma página PDF aleatória. Não é muito provável que seja descoberto por acidente (entre a carga de outros pontos de acesso obviamente muito clicáveis ​​que estavam no PDF de qualquer maneira ...).

  • Se você clicar no link, você será direcionado para uma página da Web http://my.own.site/project/87245e386722ad77b4212dbec4f0e912, com alguns pontos de "errata" inventados. (Eu mencionei que 87245e386722ad77b4212dbec4f0e912era o hash MD5 do nome da pessoa + dados de contato que eu mantinha armazenados em uma tabela do banco de dados? :-)

Obviamente, isso não protege contra impressão + digitalização + gravação ou contra um ciclo de "repetição" de PDF. E também conta com algum grau de "segurança pela obscuridade".

Aqui está como você usa o Ghostscript para adicionar um ponto de acesso clicável ao canto inferior esquerdo da página 1 de random-in.pdf:

gs \
 -o random-out.pdf \
 -sDEVICE=pdfwrite \
 -dPDFSETTINGS=/prepress \
 -c "[ /Rect [1 1 3 3]" \
 -c "  /Color [1 1 1]" \
 -c "  /Page 1" \
 -c "  /Action <</Subtype /URI" \
 -c "  /URI (http://my.own.site/87245e386722ad77b4212dbec4f0e912)>>" \
 -c "  /Subtype /Link" \
 -c "  /ANN pdfmark" \
 -f random-in.pdf

Para tornar a área clicável maior e visível, altere acima dos parâmetros da linha de comando como este:

 [....]
 -c "[/Rect [1 1 50 50]" \
 -c "  /Color [1 0 0]" \
 [....]

Ainda mais simples seria gerar e manter um hash MD5 do PDF em seu banco de dados. Será uniq para cada PDF que você criar, devido aos documentos UUID e CreationDate e ModDate dentro de seus metadados. Obviamente, isso também permite rastrear os PDFs originais em formato digital ...


Você já encontrou um PDF em estado selvagem e o rastreou usando essa técnica?
Dave Jarvis

@ Dave Jarvis: Sim, sim, de certa forma ... Mas não era uma coisa "séria", não tinha nenhum interesse real em rastrear. Fiz isso apenas como uma prova de conceito e, após cerca de 6 meses, desliguei o servidor da web de "rastreamento". Era para um servidor PDF de rede que eu havia configurado na empresa de um cliente. O "rastreador" era semelhante ao descrito acima, mas usava uma área clicável de página inteira. Eu só rastreou o número de "hits" no arquivo de log apache ....
Kurt Pfeifle

Boa ideia, mas observe que executar o GhostScript em um PDF como esse pode degradar todas as imagens de amostra que ele contém, pois o GhostScript não suporta não descompactá-las (o que perde informações de imagens compactadas no estilo JPEG na entrada) e tende a aplicar a compressão JPEG-estilo para todas as imagens (mesmo os que apenas descompactados) ...
Samb

@ SamB: Eu acho que você pode adicionar -dJPEQ=100 -dQFActor=1.0à linha de comando Ghostscript para garantir que você mantenha 100% da qualidade JPEG existente. Mas não, eu não tenho notado qualquer degradação da qualidade de imagem em meus arquivos se eu usasse a definição genérica de -dPDFSETTINGS=/prepressquando re-destilação quaisquer PDFs com Ghostscript ....
Kurt Pfeifle

[continuação] E não, não é apenas a compactação JPEG oferecida para imagens do Ghostscript - você pode usar -dColorImageFilter=/FlateEncode(que é ZIP sem perdas) para substituir o padrão =/DCTEncode(que é JPEG com perdas) nas versões GS mais antigas. Desde GS v7.21 o padrão é =/FlateEncodede qualquer maneira ... O mesmo que para a cor é verdade para -dGrayImageFilter=...( -dMonoImageFilter=...usos /CCITTFaxEncodepor padrão.)
Kurt Pfeifle

1

Muito difícil e não tenho certeza se isso responderá a todas as suas perguntas.

Não tenho certeza de uma solução completa que possa fazer isso ou aleatoriamente.

No entanto, se eu fosse encarregado disso, pensaria que a maneira mais fácil é manter o documento em um formato intermediário, como HTML formatado ou similar.

Usando um arquivo CSS de impressão ou similar, é possível obter o layout idêntico ao livro e usar algum tipo de script para selecionar aleatoriamente a imagem, o conteúdo ou qualquer coisa e um componente PDF do lado do servidor que reúne o documento.

então - por exemplo, quando alguém compra o documento, seu script de compra pode escolher aleatoriamente um número que identifique um mecanismo de proteção (por exemplo, primeira foto, segunda foto, texto em algum lugar etc.) e gerar um link de download exclusivo.

Quando esse link de download é chamado, ele verifica o número, executa a operação e compila em pdf e o baixa para o cliente.

Novamente, eu sei que isso não será fácil / direto, mas você não está pedindo algo fácil e é a melhor maneira de pensar.


@ Dave Jarvis - eu entendo completamente o que você está tentando fazer ... como eu disse, não tenho certeza da melhor solução, mas o que eu disse deve pelo menos funcionar ... apenas longe de ser fácil.
William Hilsum

@ Dave Jarvis - O que eu estava tentando dizer / transmitir é que nunca vi uma maneira fácil / única de fazer o que você quer, mas usando o PHP / ASP.Net, é mais fácil escrever scripts / ligar para terceiros componentes. Eu acho que se você tiver todo o documento em HTML formatado corretamente / exatamente, seria muito fácil usar um componente PDF para converter ... Por exemplo, digamos que haja 100 páginas e uma imagem na página 31, você poderia ter as páginas 1 a 30 como PDF e as páginas 32 a 100 como PDF, a página 31 seria gerada e formatada em html (conforme o estilo do restante do livro), você poderá usar um 1/2
William Hilsum

componente pdf que obterá o primeiro PDF, oculte a página html, obtenha o segundo PDF e gere um novo PDF combinando tudo isso. A página gerada pode chamar scripts, executar esteganografia (não tem certeza do verbo!) Ou qualquer outra coisa que você quiser ... existem muitos componentes pdf (gratuitos e pagos) - este é um, por exemplo ... componentone.com/SuperProducts / PDF Espero que isso torne um pouco mais claro o que estou tentando transmitir - apenas muito difícil de explicar. 2/2
William Hilsum

@ Dave Jarvis - ehh, não exatamente ... Como eu disse, muito difícil de explicar .... Alguns componentes PDF são incríveis, juntamente com os estilos CSS / impressão. Por exemplo, veja o Moodle. É possível formatar totalmente uma página da web e fazer com que a impressão pareça um livro / siga um estilo. Em seguida, você pode usar um componente PDF para exportar / salvar EXATAMENTE, como deve ficar no resultado final. Você pode gerar facilmente a imagem de que precisa e ter o texto e montá-la (perfeitamente para o usuário final) como um único arquivo PDF. Acabei de mencionar web / php / asp.net porque acho que é a maneira mais fácil de obter o que você deseja.
William Hilsum

@ Dave Jarvis: Eu acho que você não está usando pdfTeX, então? (Ou você estava mais preocupado com os usuários fazendo a conversão de pdf-> ps-> pdf e degradando as imagens de amostra no processo?). De qualquer forma, ps-> conversão de PDF que normalmente degradam imagens, desde GhostScript não é inteligente o suficiente para preservar imagens JPEG de estilo em forma de comprimido, e tende a aplicar automaticamente compactação JPEG-estilo para quaisquer imagens que ocorrem na entrada. (Distiller, aparentemente, pode ser instruído a deixar as imagens JPEG de estilo sozinho, mas será que alguém realmente tem isso?)
Samb
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.