Directum 5.4.2 и преобразование в PDF с защитой от копирования в DCTS

12 0

Коллеги, добрый день!

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

Directum 5.4.2. ФСТЭК, Win 2012.

Да вот не задача, сканер получает TIFF (многостраничный, это важно), а в документации сказано, что документы с защитой можно создавать только с методом Printer. А про установку пароля в документации нет ни слова. Хотя как оказалось возможность есть. Попробуем разобраться.

Не пытайтесь повторить это без резервных копий!

Первое что нужно было понять:

1. Метод Printer использует вызов WinAPI ShellExecute ( ... "print" ...) для вызова приложения, отвечающего за печать конкретного типа файла. Печать должна происходить без дополнительных окон - сказано в документации.

2. Приложений, удовлетворяющих п.1, я не нашел. Да, стандартный mspaint может печатать TIFF тихо, но не многостраничные. (Если я не прав, или плохо искал - поправьте меня, пожалуйста)

Итак, проблема 1: необходимо какое-то приложение, регистрирующее себя как обработчик по умолчанию для печати TIFF.

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

Рецепт довольно прост. Вот такие ветки нужно пофиксить в реестре.

[HKEY_CLASSES_ROOT\.tif]
@="TIFImage.Document"

[HKEY_CLASSES_ROOT\.tiff]
@="TIFImage.Document"

[HKEY_CLASSES_ROOT\TIFImage.Document\shell\print\command]
@="\"C:\\Directum\\print_tiff.cmd\" \"%1\""

Внимание!

1. Это ветка для всех пользователей. Для изменения настроек только текущего пользователя, ветка другая (не проверял).

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

Для понимания всего процесса, настоятельно рекомендую почитать документацию.

Проблема 2: преобразование из командной строки.

Дальше дело техники. Мы получили гибкий инструмент манипулирования входным файлом. Т.е. вызвали своё приложение в начале преобразования.

Но у нас до сих пор TIFF! Тут нам поможет ImageMagic (wiki). Вот такое чудо сведет задачу к уже решаемой, а заодно и немного сожмет изображения внутри PDF.

......\ImageMagick\magick.exe convert -compress lzw -quality 85 "%1" "%1.tmp.pdf"

Далее нужно только приделать AES с паролем и вернуть это все DCTS. Тадаам (герой дня - QPDF, для Windows):

qpdf.exe --encrypt "" "123456" 256 --modify=none --print=none --extract=n --cleartext-metadata --modify-other=n --form=n --annotate=n -- "%1.tmp.pdf" "%1.encrypted.pdf"

Но не тут-то было. DCTS ждет события от своего принтера NovaPDF. Поэтому подсовывание файла не помогает...

Проблема 3. Возврат результата в NovaPDF и добавление AES + пароль.

Я не придумал ничего лучше, чем использовать готовые инструменты. Ведь PDF отлично печатается без окон с помощью FoxitReader. Т.е. на нашем преобразованном файле нужно сделать ShellExecute ( ... "print" ...). Ну ок. Я не нашел консольных команд для этого ( может в powershell есть? ), поэтому вот:

ShellPrint.exe, .NET 2.0 для большей совместимости. Или любой другой язык на ваш вкус. Компилим, копируем Release версию рядом со скриптом print_tiff.cmd.

using System;
using System.Diagnostics;

namespace ShellPrint {
    class Program {
        static void Main(string[] args) {
            if (args.Length > 0) {
                try {
                    ProcessStartInfo psi = new ProcessStartInfo();
                    psi.FileName = args[0];
                    psi.Verb = "print";
                    psi.UseShellExecute = true;
                    psi.WindowStyle = ProcessWindowStyle.Normal;
                    Process.Start(psi);
                } catch (Exception e) {
                    System.Diagnostics.Debug.WriteLine("Exception: " + e.Message);
                } 
            }
        }
    }
}

Т.е. наш файл print_tiff.cmd принимает следующий вид:

@echo off
C:\Directum\ImageMagick\magick.exe convert -compress lzw -quality 85 "%1" "%1.tmp.pdf"
C:\Directum\ShellPrint.exe "%1.tmp.pdf"
del /Q %1.tmp.pdf

Ну а пароль устанавливается в профиле NovaPDF (проверьте, что вы меняете настройки в созданном для DCTS профиле, а не в профиле по умолчанию).

Галочки по вкусу. Блок трансформации в PDF в DCTS у меня такой (новый раздел в нем только <Transformation ...  Type="Printer" Profile="IS-Builder PDF Transformation Service"  Extensions="png,tif,tiff,jpg,jpeg,bmp,gif,pdf">):

<PdfTransformation PDFVersion="1.4" ConvertTimeout="3" FontEmbedding="None" WorkingFolder="C:\Users\DEV~1.DIR\AppData\Local\Temp\" EnableSpecialProcessing="False" Extensions="txt,ppt,pptx,doc,docx,xls,xlsx,rtf" PrinterName="novaPDF">
			<clear/>
			<Transformation Name="В PDF c возможностью печати и копирования" Type="Printer" Profile="IS-Builder PDF Transformation Service">
				<Security EncryptionType="Bits128" AllowPrint="True" AllowModify="False" AllowCopyExtract="True" AllowAnnotForms="False" AllowAdvancedFillForms="False" AllowAdvancedCopyExtract="False" AllowDocumentAssembly="False" AllowHighResolutionPrint="False"/>
			</Transformation>
			<Transformation Name="В PDF без возможности копирования" Type="Printer" Profile="IS-Builder PDF Transformation Service">
				<Security EncryptionType="Bits128" AllowPrint="True" AllowModify="False" AllowCopyExtract="False" AllowAnnotForms="False" AllowAdvancedFillForms="False" AllowAdvancedCopyExtract="False" AllowDocumentAssembly="False" AllowHighResolutionPrint="False"/>
			</Transformation>
			<Transformation Name="В PDF без возможности печати и копирования" Type="Printer" Profile="IS-Builder PDF Transformation Service">
				<Security EncryptionType="Bits128" AllowPrint="False" AllowModify="False" AllowCopyExtract="False" AllowAnnotForms="False" AllowAdvancedFillForms="False" AllowAdvancedCopyExtract="False" AllowDocumentAssembly="False" AllowHighResolutionPrint="False"/>
			</Transformation>
			<Transformation Name="В PDF c возможностью печати и копирования (Image)" Type="Native" Extensions="png,tif,tiff,jpg,jpeg,bmp,gif">
				<Settings Quality="Standard" IncludeDocumentProperties="True"/>
			</Transformation>
            
            <Transformation Name="В PDF без возможности печати и копирования (Image)"  Type="Printer" Profile="IS-Builder PDF Transformation Service"  Extensions="png,tif,tiff,jpg,jpeg,bmp,gif,pdf">
                <Security EncryptionType="Bits128" AllowPrint="False" AllowModify="False" AllowCopyExtract="False" AllowAnnotForms="False" AllowAdvancedFillForms="False" AllowAdvancedCopyExtract="False" AllowDocumentAssembly="False" AllowHighResolutionPrint="False"/>
			</Transformation>
            
            
            
			<Transformation Name="В PDF c возможностью печати и копирования (Word)" Type="Native" Extensions="doc,docx,rtf"><Settings Quality="Standard" IncludeDocumentProperties="True" UseISO19005_1="True" Bookmarks="Headings"/></Transformation>
            <Transformation Name="В PDF c возможностью печати и копирования (Excel)" Type="Native" Extensions="xls,xlsx"><Settings Quality="Standard" IncludeDocumentProperties="True" IgnorePrintAreas="True"/>
            </Transformation>
        </PdfTransformation>

 

В итоге получился весьма гибкий механизм, который можно использовать много где.
Ну и ждем в DCTS метода преобразования External.

Всем благ!
PS: А как вы решали бы или уже решили такую задачу?

 

Пока комментариев нет.

Авторизуйтесь, чтобы написать комментарий