Коллеги, добрый день!
Возникла у нас следующая ситуация. Необходимо было преобразовывать документы автоматически, в т.ч. при сканировании в PDF с защитой паролем от печати и копирования текста.
Directum 5.4.2. ФСТЭК, Win 2012.
Да вот не задача, сканер получает TIFF (многостраничный, это важно), а в документации сказано, что документы с защитой можно создавать только с методом Printer. А про установку пароля в документации нет ни слова. Хотя как оказалось возможность есть. Попробуем разобраться.
Первое что нужно было понять:
1. Метод Printer использует вызов WinAPI ShellExecute ( ... "print" ...) для вызова приложения, отвечающего за печать конкретного типа файла. Печать должна происходить без дополнительных окон - сказано в документации.
2. Приложений, удовлетворяющих п.1, я не нашел. Да, стандартный mspaint может печатать 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. В вашей системе могут быть уже другие ассоциации, настроенные другими приложениями. Бездумное копирование может вам что-то сломать (не ногу).
Для понимания всего процесса, настоятельно рекомендую почитать документацию.
Дальше дело техники. Мы получили гибкий инструмент манипулирования входным файлом. Т.е. вызвали своё приложение в начале преобразования.
Но у нас до сих пор 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. Поэтому подсовывание файла не помогает...
Я не придумал ничего лучше, чем использовать готовые инструменты. Ведь 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: А как вы решали бы или уже решили такую задачу?
Авторизуйтесь, чтобы написать комментарий