PDF: запутывание кодировки текста для предотвращения автоматического разбора и копирования + вставки
Я хочу сделать PDF-файл доступным на моем веб-сайте, но хочу запретить автоматический анализ ботами, которые могут не соответствовать обычной "безопасности" PDF. Причина в том, что это также коммерчески опубликовано, и мне разрешено делиться для "личного пользования", но я не должен делать его доступным для всех. Я изначально создал PDF из Word.
Я пытался использовать Ghostscript с параметром dNoOutputFonts для преобразования текста в глифы, но результат смехотворно большой (от 2,5 МБ до 180 МБ). Скремблирование кодировки текста кажется хорошим вариантом, но я почти не нашел сообщений, обсуждающих это. Кажется, есть коммерческое решение, но я не смог найти способ сделать это, например, используя Ghostscript или qpdf. Любое предложение о том, как этого добиться (или альтернативные решения)?
Операционная система: Windows 10 64bit. Доступные версии Ghostscript: 9.18, 9.27.
1 ответ
Ну, в этом преимущество шрифтов, вы должны описать каждого персонажа только один раз. Преобразование в контуры, и вам нужно описывать это каждый раз, так что да, гораздо больше.
Устройство Ghostscript pdfwrite прилагает значительные усилия, чтобы попытаться сделать текстовый поиск доступным, потому что обычно люди кричат на нас, когда "доступный для поиска" файл становится "недоступным для поиска". Таким образом (помимо всего прочего) он сохраняет любые CMAP ToUnicode во входном файле. Чтобы предотвратить простую индексацию, вам нужно избегать этого. Вы не связались с файлом PDF, поэтому я не могу это проверить, но....
Есть три места, которые нужно отредактировать:
/ghostpdl/Resource/Init/gs_pdfwr.ps, строка 642, изменить:
/WantsToUnicode /GetDeviceParam .special_op {
exch pop
}{
//true
}ifelse
Для того, чтобы:
//false
В том же файле в строке 982 измените:
/WantsToUnicode /GetDeviceParam .special_op {
exch pop
}{
//false
}ifelse
Для того, чтобы:
//false
Затем в /ghostpdl/Resource/Init/pdf_font.ps, строка 614, измените:
/ WantsToUnicode / GetDeviceParam.special_op {exch pop} {// false} ifelse
Для того, чтобы:
//ложный
Это должно предотвратить любую информацию ToUnicode в файле inptu, попадающую в выходной файл. В зависимости от используемой вами операционной системы и способа сборки Ghostscript (вы не сказали) вам может потребоваться указать Ghostscript, чтобы он включал этот каталог в путь поиска, что вы делаете с -I/ghostpdl/Resource/ В этом.
Вы также должны установить -dSubsetFonts=true
, что будет выдавать все шрифты как подмножества, я думаю, что это по умолчанию, но я не могу сразу вспомнить, и это не вредно, чтобы установить его. Это означает, что первый встреченный глиф кодируется по индексу 1, второй по индексу 2 и т. Д. Таким образом, Hello World становится 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x04, 0x07, 0x03, 0x08. Порядок будет одинаковым по всему файлу (очевидно), но разным для каждого шрифта в файле и для каждого файла. Это должно быть должным образом зашифровано, я бы подумал. Конечно, будет невозможно искать / копировать / вставлять тривиально.
Если вы сделаете файл примера доступным, я могу проверить его.
О, мне также пришло в голову, что вы можете получить тот же эффект, используя устройство ps2write для создания файла PostScript, а затем используя устройство pdfwrite для преобразования его обратно в PDF. Устройство ps2write не может встраивать ToUnicode CMaps, потому что для этого нет стандартной поддержки в PostScript. Конечно, это также означает, что содержимое возвращается к PostScript, что может привести к другим, неприемлемым изменениям качества / размера.