Программно добавлять комментарии в заголовок PDF - PullRequest
5 голосов
/ 09 июня 2009

Кто-нибудь имел успех с добавлением дополнительной информации в файл PDF?

У нас есть электронная система медицинской документации, которая производит медицинские документы для наших пользователей. Раньше эти документы были файлами Print-To-File (.prn), которые мы передавали в систему, которая отображала их как часть медицинской карты предприятия.

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

Честно говоря, мы не можем понять, как поместить информацию в файл PDF, который не нарушает файл PDF.

Вот начало одного из наших PDF-файлов ...

%PDF-1.4  
%âãÏÓ  
6 0 obj  
<<  
   /Type /XObject  
   /Subtype /Image  
   /BitsPerComponent 8  
   /Width 854  
   /Height 130  
   /ColorSpace /DeviceRGB  
   /Filter /DCTDecode  
   /Length 17734>>  
stream  

В наших файлах PRN мы вставляем такую ​​информацию:

%MRN% TEST000001
%ACCT% TEST0000000000001
%DATE% 01/01/2009^16:44
%DOC_TYPE% Clinical
%DOC_NUM% 192837475
%DOC_VER% 1

У меня вопрос: могу ли я вставить эту информацию в PDF таким образом, который позволяет серверу документов выполнять постобработку, но НЕ виден врачу, который просматривает PDF?

Спасибо,

Дэвид Уокер

Ответы [ 7 ]

6 голосов
/ 09 июня 2009

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

Тем не менее:

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

startxref
123456
%%EOF

(пример 123456). Вы можете вставить свои данные прямо перед этими тремя строками. На позицию байта части "startxref" никогда не ссылаются, поэтому вы ничего не сломаете, если протолкнете эту последнюю часть к концу.

Редактировать: Это, конечно, предполагает, что контрольная сумма, подпись или шифрование не выполняются. Это усложнит ситуацию.

Редактировать 2: Как правильно указал Хавьер, вы также можете просто добавить свои данные в конец и просто добавить копию трех строк в конец этого. Сводится к тому же, но это немного проще.

3 голосов
/ 10 июня 2009

PDF-файлы должны иметь несколько версий, просто добавляемых в конце; но самый конец должен иметь смещение к основной справочной таблице. Просто прочитайте последние три строки, добавьте свои данные и снова присоедините исходное окончание.

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

2 голосов
/ 12 сентября 2010

Вы когда-нибудь думали встроить вашу дополнительную информацию в PDF как отдельный файл?

Общая спецификация PDF позволяет "прикреплять файлы" к PDF-файлам. Прикрепленные файлы могут быть любыми: * .txt, * .doc, * .xsl, * .html или даже .pdf. Прикрепленные файлы содержатся в PDF-файле «контейнера» без повреждения содержимого самого контейнера. (Спецификации PDF специального назначения, такие как PDF / A- и PDF / X- *, могут накладывать некоторые ограничения на встроенные / прикрепленные файлы.)

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

Я часто использовал эту функцию для различных целей:

  • сохранить родительский документ (например, .doc) внутри .pdf, из которого изначально был создан .pdf;
  • пометить информацию о приеме на работу в файл печати, который отправляется в типографию;
  • etc.pp.

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

Однако нет никаких причин, по которым вы не сможете поместить вашу дополнительную информацию в файл medical-record-info.txt произвольной длины и внутреннего формата и прикрепить его к PDF:

 MRN TEST000001
 ACCT TEST0000000000001
 DATE 2009-01-01
 TIME 16:44:33.76
 DOC_TYPE Clinical
 DOC_NUM 192837475
 DOC_VER 1
 MORE_INFO blah blah

 Hi, guys,
     can you please process this file faster than usual? If you don't,
     someone will be dying.
 Seriously, David. 

FWIW, инструменты командной строки pdftk.exe (Windows) и pdftk (Linux) могут прикреплять и отсоединять внедренные файлы из своего контейнера PDF. Acrobat Reader также может обрабатывать вложения.

Вы можете настроить / запрограммировать / написать скрипт на сервере документов, обрабатывающем PDF, для автоматического отсоединения встроенного файла .txt и запуска действий в соответствии с его содержимым.

Конечно, врач, который просматривает PDF, сможет увидеть, что в PDF есть вложение. Но это не появится в его "нормальном" просмотре. Ему придется предпринять определенные дополнительные действия, чтобы извлечь и просмотреть его. (И затем есть возможность установить пароль в PDF, чтобы защитить его от несанкционированных отсоединений файлов. И / или закодировать, затемнить rot13 .txt. Не совсем надежные методы, но % врачей не смогут этого сделать, даже если вы научите их, как ...)

1 голос
/ 16 июня 2009

Вы можете хранить данные в виде реальных метаданных PDF. Например, с CAM :: PDF вы можете записать метаданные следующим образом:

use CAM::PDF;
my $pdf = CAM::PDF->new('temp.pdf') || die;
my $info = $pdf->getValue($pdf->{trailer}->{Info}) || die;
$info->{PRN} = CAM::PDF::Node->new('dictionary', {
   DOC_TYPE => CAM::PDF::Node->new('string', 'Clinical'),
   DOC_NUM  => CAM::PDF::Node->new('number', 192837475),
   DOC_VER  => CAM::PDF::Node->new('number', 1),
});
$pdf->cleanoutput('out.pdf');

Узел Info в PDF-файле выглядит следующим образом:

8 0 obj
<< /CreationDate (D:20080916083455-04'00')
/ModDate (D:20080916083729-04'00')
/PRN << /DOC_NUM 192837475 /DOC_TYPE (Clinical) /DOC_VER 1 >> >>
endobj

Вы можете читать данные PRN обратно так (упрощенный код ...)

my $pdf = CAM::PDF->new('out.pdf') || die;
my $info = $pdf->getValue($pdf->{trailer}->{Info}) || die;
my $prn = $info->{PRN};
if ($prn) {
   my $prndict = $pdf->getValue($prn);
   for my $key (sort keys %{$prndict}) {
      print "$key = ", $pdf->getValue($prndict->{$key}), "\n";
   }
}

Что делает вывод следующим образом:

DOC_NUM = 192837475
DOC_TYPE = Clinical
DOC_VER = 1

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

1 голос
/ 09 июня 2009

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

Ваш поставщик может удалить эти комментарии после постобработки, чтобы он фактически не попал к врачам.

0 голосов
/ 11 июня 2009

Думали ли вы об использовании XMP?

0 голосов
/ 10 июня 2009

В какой-то момент мы меняли некоторый код Acrobat JS, делая замену текста в простом (незашифрованном) PDF. Хитрость заключалась в том, что длины каждого блока PDF были жестко запрограммированы в документе. Итак, мы не смогли изменить количество символов. Мы бы просто добавили лишние пробелы.

Отлично сработало, код JS выполнил все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...