以编程方式将注释添加到PDF标题

时间:2009-06-09 19:21:03

标签: pdf

是否有人在向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 个答案:

答案 0 :(得分:6)

是的,你可以。 PDF文件中以百分号开头的任何行都是注释,因此被忽略(PDF的前两行实际上也是注释)。因此,您可以像在PRN中一样将信息插入到PDF中。

然而:

PDF格式与字节位置引用一起使用,因此如果将数据插入到已完成的PDF文件中,这将使其余数据远离其原始位置,从而破坏文件。您也不能将其附加到文件中,因为PDF文件必须以

结尾
startxref
123456
%%EOF

(123456就是一个例子)。您可以在这三行之前插入数据。 “startxref”部分的字节位置从不在任何地方引用,因此如果将最后一部分推向最后,则不会破坏任何内容。

编辑:这当然假设没有校验和,签名或加密。这会让事情变得更复杂。

编辑2:正如Javier正确指出的那样,您也可以将数据添加到最后,只需将三行的副本添加到其末尾即可。归结为同样的事情,但它更容易。

答案 1 :(得分:3)

PDF应该有最后附加的多个版本;但最终必须有主参考表的偏移量。只需阅读最后三行,附加数据并重新附加原始结尾。

您可以删除原始结尾或将其放在那里。 PDF阅读器将直到最后并使用倒数第二行来查找参考表。

答案 2 :(得分:2)

你有没有想过将PDF中的附加信息作为单独的文件嵌入?

通用PDF规范允许“附加文件”到PDF。附加文件可以是任何内容:* .txt,* .doc,*。xsl,* .html甚至 .pdf。附加文件包含在PDF“容器”文件中,而不会破坏容器自己的内容。 (诸如PDF / A - 和PDF / X- *等特殊用途的PDF规范可能会对嵌入/附加文件施加一些限制。)

这使您可以将其他信息和/或数据绑定到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。不完全是坚如磐石的方法,但即使你教他们如何...... 99%的医生也无法完成它。)

答案 3 :(得分:1)

您仍然可以使用%字符将注释插入PDF文件。但任何人都可以使用文本编辑器进行访问。

您的供应商可以在后处理后删除这些评论,因此实际上并没有找到医生。

答案 4 :(得分:1)

您可以将数据存储为真实的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');

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支持任意嵌套的数组,字典和引用,因此可以表示任何数据。例如,我为了好玩而构建了一个完整的filesystem embedded in a PDF

答案 5 :(得分:0)

有一次,我们通过在普通(未加密的)PDF中进行文本替换来更改一些Acrobat JS代码。诀窍是每个PDF块的长度都在文档中进行了硬编码。所以,我们无法改变字符数。我们只需添加额外的空格。

它工作得很好,JS代码执行了全部。

答案 6 :(得分:0)

您是否考虑过使用XMP?