是否有人在向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的医生不可见?
谢谢,
大卫沃克
答案 0 :(得分:6)
是的,你可以。 PDF文件中以百分号开头的任何行都是注释,因此被忽略(PDF的前两行实际上也是注释)。因此,您可以像在PRN中一样将信息插入到PDF中。
然而:
PDF格式与字节位置引用一起使用,因此如果将数据插入到已完成的PDF文件中,这将使其余数据远离其原始位置,从而破坏文件。您也不能将其附加到文件中,因为PDF文件必须以
结尾startxref
123456
%%EOF
(123456就是一个例子)。您可以在这三行之前插入数据。 “startxref”部分的字节位置从不在任何地方引用,因此如果将最后一部分推向最后,则不会破坏任何内容。
编辑:这当然假设没有校验和,签名或加密。这会让事情变得更复杂。
编辑2:正如Javier正确指出的那样,您也可以将数据添加到最后,只需将三行的副本添加到其末尾即可。归结为同样的事情,但它更容易。
答案 1 :(得分:3)
PDF应该有最后附加的多个版本;但最终必须有主参考表的偏移量。只需阅读最后三行,附加数据并重新附加原始结尾。
您可以删除原始结尾或将其放在那里。 PDF阅读器将直到最后并使用倒数第二行来查找参考表。
答案 2 :(得分:2)
通用PDF规范允许“附加文件”到PDF。附加文件可以是任何内容:* .txt,* .doc,*。xsl,* .html甚至 .pdf。附加文件包含在PDF“容器”文件中,而不会破坏容器自己的内容。 (诸如PDF / A - 和PDF / X- *等特殊用途的PDF规范可能会对嵌入/附加文件施加一些限制。)
这使您可以将其他信息和/或数据绑定到PDF文件,并允许常见的存储和处理。附加文件不应该干扰任何PDF查看器的渲染。
我经常使用该功能,出于各种目的:
当然,最近在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?