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

以编程方式向PDF标题添加注释,pdf,Pdf,是否有人成功地将其他信息添加到PDF文件中 我们有一个电子病历系统,为我们的用户生成医疗文件。在过去,这些文档被打印成文件(.prn)文件,我们将这些文件输入到一个系统,该系统将它们显示为企业医疗记录的一部分 现在,医院的企业病历供应商希望以PDF格式接收文档,但仍然希望将所有相同的信息存储在标题中 老实说,我们不知道如何将信息放入一个不会破坏PDF文件的PDF文件中 这是我们的一个PDF的开始 %PDF-1.4 %âãÏÓ 6 0 obj << /Type /

是否有人成功地将其他信息添加到PDF文件中

我们有一个电子病历系统,为我们的用户生成医疗文件。在过去,这些文档被打印成文件(.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  
我的问题是,我能否以允许文档服务器执行后期处理的方式将这些信息插入PDF中,而查看PDF的医生却看不到这些信息

谢谢,


David Walker

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


您的供应商可以在后期处理后删除这些评论,因此它实际上不会送达医生。

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

然而:

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

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

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


编辑2:正如Javier正确指出的,您也可以只将数据添加到末尾,然后只将三行的副本添加到末尾。归结为同一件事,但要简单一点。

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


您可以删除原始结尾,也可以将其放在那里。PDF阅读器只需走到最后一行,使用倒数第二行查找参考表。

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


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

您考虑过使用XMP吗?

您可以将数据存储为真正的PDF元数据。例如,使用可以编写如下元数据:

%MRN% TEST000001
%ACCT% TEST0000000000001
%DATE% 01/01/2009^16:44
%DOC_TYPE% Clinical
%DOC_NUM% 192837475
%DOC_VER% 1
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');
8 0 obj
<< /CreationDate (D:20080916083455-04'00')
/ModDate (D:20080916083729-04'00')
/PRN << /DOC_NUM 192837475 /DOC_TYPE (Clinical) /DOC_VER 1 >> >>
endobj
DOC_NUM = 192837475
DOC_TYPE = Clinical
DOC_VER = 1
PDF的信息节点如下所示:

%MRN% TEST000001
%ACCT% TEST0000000000001
%DATE% 01/01/2009^16:44
%DOC_TYPE% Clinical
%DOC_NUM% 192837475
%DOC_VER% 1
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');
8 0 obj
<< /CreationDate (D:20080916083455-04'00')
/ModDate (D:20080916083729-04'00')
/PRN << /DOC_NUM 192837475 /DOC_TYPE (Clinical) /DOC_VER 1 >> >>
endobj
DOC_NUM = 192837475
DOC_TYPE = Clinical
DOC_VER = 1
这使得输出如下所示:

%MRN% TEST000001
%ACCT% TEST0000000000001
%DATE% 01/01/2009^16:44
%DOC_TYPE% Clinical
%DOC_NUM% 192837475
%DOC_VER% 1
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');
8 0 obj
<< /CreationDate (D:20080916083455-04'00')
/ModDate (D:20080916083729-04'00')
/PRN << /DOC_NUM 192837475 /DOC_TYPE (Clinical) /DOC_VER 1 >> >>
endobj
DOC_NUM = 192837475
DOC_TYPE = Clinical
DOC_VER = 1
PDF支持任意嵌套的数组、字典和引用,因此几乎可以表示任何数据。例如,我建了一个完整的只是为了好玩

你有没有想过把你的附加信息作为一个单独的文件嵌入到PDF中? 通用PDF规范允许将文件“附加”到PDF。附件可以是:*.txt、*.doc、*.xsl、*.html甚至.pdf。附加文件包含在PDF“容器”文件中,不会损坏容器本身的内容。(特殊用途的PDF规范,如PDF/A-和PDF/X-*可能会对嵌入/附加文件施加一些限制。)

这允许您将其他信息和/或数据绑定到PDF文件,并允许进行公共存储和处理。附加文件应该不会干扰任何PDF查看器的渲染

我经常出于各种目的使用该功能:

  • 将父文档(如.doc)存储在最初创建.pdf的.pdf中
  • 将工作通知单信息标记到发送到printshop的打印文件中
  • 等等,pp
当然,最近发现并发布的PDF处理软件(以及PDF规范本身)中的缺陷建议不要将二进制文件嵌入/附加到PDF文件中-- 因为默认情况下,越来越多的读卡器将阻止您轻松提取/分离嵌入/附加的文件

但是,您没有理由不能将附加信息放入任意长度和内部格式的
病历信息.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上设置密码,以防止未经授权的文件分离。和/或对.txt进行编码、隐藏、
rot13
txt。这并不完全是可靠的方法,但99%的医生即使你教他们怎么做也无法做到……)

这很接近。Acrobat PDF reader 9不在乎我在最后%%EOF后发表评论。读取和写入文件流以将字符放入新文件中改变了actu