
Фон
Использование LaTeX для написания книги. Когда пользователь покупает книгу, PDF-файл будет сгенерирован автоматически.
Проблема
PDF-файл должен иметь водяной знак, включающий имя человека и контактную информацию.
Вопрос
Какое программное обеспечение соответствует следующим критериям:
- Применяет зашифрованные, невидимые водяные знаки к PDF-файлу
- Открытый источник
- Независимость от платформы (Linux, Windows)
- Быстро (создает PDF-файл объемом 200 страниц менее чем за 1 секунду)
- Пакетная обработка (исключительно из командной строки)
- Устойчивость к сговору и атакам
- Нехрупкий (например, PDF -> EPS -> PDF все еще содержит водяной знак)
- Хорошо документировано (приведены примеры использования)
Идеи и ресурсы
Некоторые мысли и выводы:
- Водяные знаки обработки естественного языка (NLP).
- Примените стеганографию к случайно выбранному изображению.
- http://openstego.sourceforge.net/cmdline.html
Проблема с NLP заключается в том, что могут быть внесены грамматические ошибки. Проблема со стеганографией заключается в том, что изображения берутся из кэша изображений, и поэтому повторное создание этого кэша с изображениями с водяными знаками приведет к задержке при генерации PDF (я мог бы просто удалить одно изображение из кэша, но это не элегантное решение).
Спасибо!
решение1
Я сделал нечто подобное несколько лет назад. Это не отвечало всем вашим "жестким" критериям. Это работало так:
Я поместил едва заметную, размером 2x2 точки, "кликабельную" область в каком-то случайном месте на одной из границ случайной страницы PDF. Маловероятно, что ее обнаружат случайно (среди кучи других явно кликабельных горячих точек, которые в любом случае были в PDF...).
Если вы нажмете на ссылку, она перенаправит вас на веб-страницу
http://my.own.site/project/87245e386722ad77b4212dbec4f0e912
с выдуманными пунктами «опечаток». (Я уже говорил, что это87245e386722ad77b4212dbec4f0e912
был MD5-хэш имени человека + контактные данные, которые я хранил в таблице базы данных? :-)
Очевидно, что это не защищает от печати+сканирования+ocr-ing или от цикла "перерисовки" PDF. И это также полагается на некоторую степень "безопасности через неизвестность".
Вот как использовать Ghostscript для добавления такой интерактивной области в нижний левый угол первой страницы файла 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
Чтобы сделать область клика больше и видимее, измените указанные выше параметры командной строки следующим образом:
[....]
-c "[/Rect [1 1 50 50]" \
-c " /Color [1 0 0]" \
[....]
Еще проще было бы сгенерировать и сохранить MD5-хэш PDF в вашей базе данных. Он будет уникальным для каждого созданного вами PDF из-за UUID документа, CreationDate и ModDate внутри его метаданных. Конечно, это также позволяет отслеживать только исходные PDF в их цифровой форме...
решение2
Очень сложный вопрос, и я не уверен, что он ответит на все ваши вопросы.
Я не уверен, что существует универсальное решение, которое может это сделать или рандомизировать.
Однако если бы мне поручили такую задачу, я бы подумал, что самый простой способ — сохранить документ в промежуточном формате, например, в формате HTML или подобном.
Используя файл CSS для печати или аналогичный файл, вы можете сделать макет идентичным книге и использовать какой-либо скрипт для рандомизации изображений, контента или чего-либо еще, а также серверный компонент PDF, который собирает документ обратно.
Итак, например, когда кто-то покупает документ, ваш скрипт покупки может случайным образом выбрать число, которое идентифицирует механизм защиты (например, первое изображение, второе изображение, текст где-то и т. д.), а затем сгенерировать уникальную ссылку для скачивания.
При вызове этой ссылки для загрузки она проверяет номер, выполняет операцию и компилирует в PDF-файл, а затем загружает его клиенту.
Опять же, я знаю, что это будет нелегко/непрямолинейно, но вы и не просите о чем-то легком, и это лучший способ, который я могу придумать.