Преобразователь Html2Pdf отключает выделение текста

Я использую html2pdf lib для создания pdf-файла из html. И я пытаюсь запретить пользователям копировать содержимое PDF

ConverterProperties converterProperties = new ConverterProperties();
try {
    HtmlConverter.convertToPdf(html, new FileOutputStream(fileName), converterProperties);
} catch (IOException e) {
    e.printStackTrace();
} 

Где html это шаблон тимелеафа. После этого я попадаю в корень файла PDF проекта. Но мне нужно отключить выделение текста в этом PDF-файле (как будто он был создан из изображения). Как можно отключить текст в PDF-файле и, например, во втором слое PDF-файла поместить невидимый текст


person Betsko Roman    schedule 23.12.2019    source источник
comment
Является ли конечная цель не позволять пользователям копировать текст и не иметь возможности выбирать текст только средством достижения этой цели? Потому что вы можете настроить флаги разрешения документа, чтобы пользователи могли выбирать текст, но не могли копировать его в буфер обмена.   -  person Alexey Subach    schedule 28.12.2019
comment
@AlexeySubach Я планирую передать эти pdf-файлы в некоторые библиотеки для синтаксического анализа и хочу добавить невидимый слой текста для лучшего синтаксического анализа. Если библиотека типа sovren разбирает файлы, созданные таким образом, результат будет лучше. Я реализую это, создавая pdf-файл из html, -> изображение из pdf, -> pdf из изображения. Но это плохой способ( Результат должен быть примерно таким: [docdro.id/qphnWF8]   -  person Betsko Roman    schedule 30.12.2019


Ответы (1)


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

PdfWriter pdfWriter = new PdfWriter("C:/out.pdf", new WriterProperties().setStandardEncryption(
        "".getBytes(), "ownerPass".getBytes(), EncryptionConstants.ALLOW_SCREENREADERS, EncryptionConstants.ENCRYPTION_AES_256));
PdfDocument pdfDocument = new PdfDocument(pdfWriter);
HtmlConverter.convertToPdf(new FileInputStream("C:/in.html"), pdfDocument);
pdfDocument.close();

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

PdfDocument pdfDocument = new PdfDocument(new PdfReader("C:/out.pdf",
        new ReaderProperties().setPassword("ownerPass".getBytes())),
        new PdfWriter("C:/decrypted.pdf"));
pdfDocument.close();
person Alexey Subach    schedule 12.01.2020
comment
Да, я нахожу информацию об этом, но это все еще не то, что мне нужно. В комментарии я даю ссылку, где загружен пример. Для моей ситуации PDF должен быть создан из изображения (а не из html) - person Betsko Roman; 13.01.2020