Как программно изменить / защитить текстовое содержимое в PDF, чтобы оно больше не копировалось?

Я хочу сделать противоположное OCR, я не хочу превращать изображения в текст, я хочу превратить весь текст в PDF в изображение, чтобы его нельзя было случайно выбрать и скопировать.

В Acrobat Pro это хорошо, но мне бы очень хотелось, чтобы я мог использовать что-то из командной строки Linux, так как у меня есть много этих PDF-файлов, и они в настоящее время находятся на веб-сайте. Если бы я мог внести это изменение на месте на сервере, это сэкономило бы мне часы загрузки, обработки, обработки в Acrobat, повторной загрузки, которая должна выполняться через интерфейс моей CMS, что очень медленно.

Так что если есть какой-нибудь инструмент PDF, который может сделать это легко, я могу использовать его из терминала, что было бы здорово.

3 ответа

Решение

Я полагаю, что ваша цель состоит в том, чтобы сделать более трудным отбор и копирование текста из PDF. Потому что это единственная достижимая цель, которую вы можете поставить. (Если есть способ увидеть страницы PDF на экране, то есть способ каким-то образом получить доступ к тексту или содержимому изображения, хотя и более сложный, чем просто копировать и вставлять... Я полагаю, вы осознавая это.)

У вас есть три варианта:

  1. Преобразуйте свои страницы PDF в полностраничные пиксельные изображения и снова оберните эти изображения в многостраничный PDF.
  2. Преобразуйте глифы всех встроенных шрифтов в векторные контуры.
  3. "Зашифруйте" свой PDF с помощью пароля пользователя.

Каждый из этих трех методов очень прост в применении, если использовать правильный инструмент.:-)

Для каждого из этих методов вы можете использовать инструмент свободного и открытого программного обеспечения в командной строке. (Каждый из этих инструментов доступен для Linux, Mac OSX, Unix или Windows.)

Более подробное обсуждение каждого метода приведено ниже.

1. Создайте пиксельные изображения на всю страницу (используя ImageMagick's convert)

Вы можете использовать ImageMagick convert Команда просто так:

 convert              \
   pdf-with-fonts.pdf \
   pdf-with-images.pdf

ImageMagick может напрямую работать только с растровыми изображениями, но не с любым другим форматом. Поскольку он не может обрабатывать PDF-файлы напрямую, он автоматически использует Ghostscript в качестве своего делегата. Следовательно, Ghostscript также должен быть установлен! Ghostscript создаст растровые изображения, необходимые для ввода в ImageMagick.

Вы можете наблюдать за процессом ImageMagick, используя Ghostscript в качестве фонового процесса, добавив -verbose переключитесь на вашу командную строку.

По умолчанию, convert будет использовать разрешение 72ppi. Это может быть недостаточно для хорошего чтения (но будет намного сложнее обойти вашу "защиту", применив программное обеспечение OCR к выходу).

Пиксельная страница PDF с 72 PPI при 600% увеличении

На изображении выше показан снимок экрана с пиксельной страницей PDF, созданной с разрешением по умолчанию (72 PPI), используемым ImageMagick при уровне масштабирования 600%. Если вам нужно лучшее разрешение, скажем, 200 PPI, добавьте -density 200 Параметр для командной строки:

 convert              \
  -density 200        \
   pdf-with-fonts.pdf \
   pdf-with-images.pdf

Пиксельная страница PDF с 200 PPI при 600% увеличении

На изображении выше показан снимок (также с масштабом 600%) страницы PDF в пикселях, созданной ImageMagick с более высоким разрешением 200 PPI.

Обратите внимание: когда я тестировал указанную выше команду с разрешением по умолчанию 72 PPI, файл PDF объемом 219 страниц со всем текстом и размером 1 МБ приводил к выходному файлу размером 23 МБ. Генерация заняла около 2 минут на MacBook. PDF 200ppi показал 110 МБайт и занял 11 минут, чтобы быть готовым...

Обойти?

Пикселизацию страниц легко обойти, если разрешение достаточно хорошее: оптическое распознавание текста будет работать просто отлично. При низком разрешении оно все же может быть читаемым (и предполагаемым) для людей, но машинам трудно получить хорошие результаты распознавания.

2. Преобразовать все символы в векторные контуры (используя Ghostscript)

Вы можете использовать новейшую и самую последнюю версию Ghostscript. Это версия v9.15. Проверьте установленную версию с gs -version,

Последняя версия v9.15 включает в себя новый параметр командной строки, --dNoOutputFonts, Этот параметр преобразует все формы глифов в контуры и удалит все встроенные шрифты:

gs                        \
 -o pdf-with-outlines.pdf \
 -sDEVICE=pdfwrite        \
  pdf-with-fonts.pdf

В моем тесте тот же 219-страничный PDF-файл (размером 1 МБ) был преобразован в выходной файл размером 186 МБ, что потребовало 6 минут для преобразования.

Преимущество контуров в том, что текст страницы остается четким, четким и непиксельным, и вы можете увеличивать текст на любом уровне, не теряя резкости. Вы можете увидеть это на следующем скриншоте:

Векторизованный текст на странице PDF при увеличении 600

Недостатком является размер файла. (Кстати, я протестировал тот же метод, конвертируя текст в контуры, с помощью Ado be Acrobat Pro XI, и в результате размер файла составил 61 МБ, что заняло 15 минут).

Обойти?

Эту меру легко обойти: OCR будет работать просто отлично.

3. Защитите PDF, зашифровав его (используя qpdf)

Что не так хорошо известно, так это то, что вы можете "защитить" или ("зашифровать") PDF-файл с пустыми паролями (пароли "пользователя" и "владельца"). Это позволяет всем программам чтения / просмотра PDF открывать файл без запроса пароля, а только при открытии диалогового окна ввода пароля при попытке скопировать текст со страницы или при печати файла.

QPDF имеет довольно хорошую поддержку для этого:

qpdf                    \
  --encrypt  ""  ""  40 \
  --print=n             \
  --modify=n            \
  --extract=n           \
  --                    \
    uncrypted.pdf       \
    crypted.pdf

Что означают все эти параметры команды?

  • --encrypt "" "" 40:
    При этом пароли (пользователь и владелец) устанавливаются в пустую строку, а длина ключа - в 40 бит.

  • --print=n:
    Это отключает печать PDF.

  • --modify=n:
    Это отключает модификацию PDF.

  • --extract=n:
    Это отключает извлечение текста и изображений из PDF.

  • --:
    Это необходимо, чтобы сигнализировать об окончании параметров шифрования.

В QPDF доступно больше (и разных) подробных опций, если вы используете длину ключа 128 или 256 бит. Другие доступные варианты включают --modify=[annotate|form|assembly] который позволял бы заполнять формы, добавлять аннотации или собирать документ с другими PDF-файлами (в то же время все еще не разрешая копировать или вставлять или печатать).

Эта команда

 qpdf --show-encryption crypt.pdf 

Покажет подробную информацию о настройках шифрования любого файла. Пример:

 extract for accessibility: not allowed
 extract for any purpose: not allowed
 print low resolution: not allowed
 print high resolution: not allowed
 modify document assembly: not allowed
 modify forms: allowed
 modify annotations: allowed
 modify other: not allowed
 modify anything: not allowed

Кстати: оставив пароль пустым в двух диалоговых окнах, показанных выше, не поможет (большинство? Или все? Еще не проверяли...) просмотрщиков PDF. Он по-прежнему не разблокируется для копирования или печати.

Преимущество этого метода заключается в его быстром выполнении и практически идентичном размере файла.

Обойти?

Конечно, так же легко снова удалить "шифрование":

qpdf --decrypt crypted.pdf decrypted.pdf

4. Резюме

Для быстрых результатов, идентичных размеров файлов и легко удаляемой защиты от "случайного" выделения и копирования текста используйте "защита" / "шифрование" с пустым паролем.

Для получения медленных результатов и потенциально больших размеров файлов (но не всегда хорошо выглядящих страниц) и немного больше работы, которую нужно удалить, используйте пикселизацию для всех страниц.

Для еще более медленных результатов (но всегда лучше выглядящих страниц), а также для большей работы по удалению защиты используйте векторный метод выделения текста для всего текста.

Всегда помните, что все эти методы не защищают содержимое ваших страниц PDF. Они только делают его более неудобным для извлечения.

Похоже, что лучше всего использовать ImageMagick для преобразования PDF-файлов в изображения любого типа из командной строки. Этот сайт предоставляет некоторые подробные сведения о том, как использовать PHP с ImageMagick для автоматизации этой задачи. Но на самом фундаментальном уровне этот сайт объясняет основы этого из командной строки терминала:

convert my_great_file.pdf my_great_file.png

Чтобы изменить формат вывода с PNG на JPEG, просто измените расширение файла конечного имени файла следующим образом:

convert my_great_file.pdf my_great_file.jpg

Хитрость в вашем случае заключается в том, что вам нужно убедиться, что на вашем хостинге установлена ​​программа ImageMagick. И если нет, то будут ли они готовы установить его. По моему опыту, ImageMagick является настолько часто используемым инструментом, что он должен быть там. Единственный потенциальный "уловка" - установка не была выполнена со встроенной поддержкой PDF. Но это для вас, чтобы выяснить и иметь дело с.

Кроме того, если вы создаете отдельные файлы изображений из PDF-файла, достаточно легко создать новый PDF-файл только с такими файлами изображений:

convert *.jpg my_new_great_file.pdf

Кроме того, кажется, что convert Вы можете выполнить прямое преобразование PDF в PDF с помощью растеризации конечного продукта, просто выполнив следующее:

convert my_great_file.pdf my_new_great_file.pdf

Это дало бы PDF с растеризованным выводом с разрешением 72 dpi. Вы можете изменить это, если это необходимо, используя -density вариант как этот:

convert -density 144 my_great_file.pdf my_new_great_file.pdf

Что позволит создать новый PDF-файл, состоящий из растровых изображений с разрешением 144 т / д.

Ты можешь использовать pdftk:

pdftk input.pdf output protected.pdf owner_pw "secret" allow ScreenReaders

Это устанавливает пароль, отключая ModifyContents и CopyContents, но разрешая ScreenReaders.

Что-то, что не зависит от Java, будет qpdf, но у меня нет точного синтаксиса под рукой.

Другие вопросы по тегам