代码之家  ›  专栏  ›  技术社区  ›  David Walker

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

pdf
  •  6
  • David Walker  · 技术社区  · 17 年前

    有人成功地将其他信息添加到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 回复  |  直到 17 年前
        1
  •  6
  •   balpha    17 年前

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

    startxref
    123456
    %%EOF
    

        2
  •  3
  •   Javier    17 年前

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

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

        3
  •  2
  •   Kurt Pfeifle    15 年前

    PDF。附件可以是任何文件:*.txt、*.doc、*.xsl、*.html甚至 .pdf。附件包含在pdf“容器”文件中,不会损坏容器本身的内容。(特殊用途的PDF规范,如PDF/A- PDF/X-*可能会对嵌入/附加文件施加一些限制。)

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

    • 将父文档(如.doc)存储在最初创建.pdf的.pdf中;
    • 将作业票务信息标记到发送到打印车间的打印文件中;
    • 等等pp。

    当然,最近在PDF处理软件(以及PDF规范本身)中发现并发布的缺陷建议不要将二进制文件嵌入/附加到PDF文件中--

    但是,没有理由不将您的附加信息放入 medical-record-info.txt

     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. 
    

    pdftk.exe pdftk (Linux)能够从其容器PDF中附加和分离嵌入式文件。Acrobat Reader还可以处理附件。

    当然,查看PDF的医生可以看到PDF中有一个文件附件。但它不会出现在他的“正常”观看中。他必须采取具体的额外行动才能提取和查看它。 (然后可以选择在PDF上设置密码,以保护其免受未经授权的文件分离。和/或编码、模糊、, rot13

        4
  •  1
  •   eduffy    17 年前

    您仍然可以使用 % 性格。但任何人都可以通过文本编辑器访问。

        5
  •  1
  •   Chris Dolan    17 年前

    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

        6
  •  0
  •   Tom Hubbard    17 年前

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

        7
  •  0
  •   Tim Scarborough    17 年前