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