【问题标题】:merging XFDF with PDF form to create final PDF server-side?将 XFDF 与 PDF 表单合并以创建最终的 PDF 服务器端?
【发布时间】:2011-01-06 00:50:34
【问题描述】:

这是我目前拥有的:

  • 用户提交表单数据并获得“下载 PDF”链接。

  • 链接指向脚本,该脚本即时生成 XFDF 文件并在设置适当的标头等后输出 XFDF 文件。

  • XFDF 文件指向受密码保护的 PDF,这是使用 XFDF 数据填写字段的通用 PDF 表单。

我想要什么:

  • 用户点击“下载 PDF”链接。

  • XFDF 是动态生成的(没有文件写入服务器)。

  • PDF 和 XFDF 使用通用 PDF 在服务器端合并。最终 PDF 的内容与最初的 XFDF 一样输出给用户。

  • XFDF 和最终的 PDF 都不会保存到服务器。

我正在查看pdftk,它有一些处理 FDF/XFDF 文件的选项,但所有这些都假设 a) 原始 XFDF 文件作为文件存在于服务器上,并且 b) 生成的 PDF应该作为文件输出到服务器上。

另外,pdftk 已经 4 岁了。

我想知道是否:

a) 那里有与 pdftk 等效的更新版本吗?

b) 如果有办法,使用较新的类似 pdftk 的工具或使用 pdftk,使用动态路径,这样数据就不必以文件形式存在于服务器上?

我最近了解了使用 php:// 的内置输入/输出流,但我对如何使用它仍然很模糊,但也许这是一个很好的地方?

【问题讨论】:

    标签: php pdf streaming pdftk xfdf


    【解决方案1】:

    我自己听取了 khkremer 的建议,并在 C# 中构建了一个小型 .net exe,以基于 itextsharp 库从 xfdf 文件创建 PDF。它仍然需要使用 passthru 来调用,但它又好又小。我的版本还可以选择在 pdf 中插入隐藏字段,因为我的项目需要该功能。

    您需要下载并添加对 iTextSharp.text.pdf 程序集的引用。

    希望对你有帮助!

     using System;
     using System.IO;
     using iTextSharp.text.pdf;
    
    namespace PDFBrain
    {
        class Program
        {
            // args:
            // 0 => template
            // 1 => xfdf
            // 2 => outputfile
            // 3 => flatten output file?
            static void Main(string[] args)
            {
                if (args == null)
                {
                    Console.Out.WriteLine("No arguments were provided. Exiting.");
                    return;
                }
    
                if (args[0] == "create")
                {
                    if (args.Length != 5)
                    {
                        Console.Out.WriteLine("Wrong number of arguments were provided. Exiting.");
                        return;
                    }
                    CreatePDF(args[1], args[2], args[3], args[4]);    
                }
    
                if (args[0] == "hidden")
                {
                    if (args.Length != 3)
                    {
                        Console.Out.WriteLine("Wrong number of arguments were provided. Exiting.");
                        return;
                    }
    
                    InsertHiddenIdField(args[1], args[2]);
                }
    
            }
    
    
    public static void CreatePDF(string templ, string xfdf, string output, string flatten)
        {
            PdfReader template = new PdfReader(templ);
    
            XfdfReader xfdfReader = new XfdfReader(xfdf);
    
            PdfStamper stamper = new PdfStamper(template, new FileStream(output, FileMode.Create));
            stamper.AcroFields.SetFields(xfdfReader);
    
            stamper.FormFlattening = flatten == "true" ? true : false;
    
            stamper.Writer.CloseStream = false;
            stamper.Close();
    
        }
    
        public static void InsertHiddenIdField(string templ, string output)
        {
            PdfReader template = new PdfReader(templ);
    
            PdfStamper stamper = new PdfStamper(template, new FileStream(output, FileMode.Create));
    
            TextField clientID = new TextField(stamper.Writer, new iTextSharp.text.Rectangle(10,750,60,770), "hdnClientID");
            clientID.Visibility = BaseField.HIDDEN;
    
            stamper.AddAnnotation(clientID.GetTextField(),1);
    
            stamper.Close();            
        }
    }
    

    }

    【讨论】:

      【解决方案2】:

      有一些商业应用程序可以做到这一点(您可以在 pdfstore.com 找到一些),但是通过一些编程,您可以使用 pdftk 用于处理 PDF 文件的相同库创建自己的应用程序:iText (http://itextpdf.com/)还有一个 .NET 版本 - iTextSharp。

      通过这样做,您可以从 Java 或 .NET 程序访问您的数据,而且它不需要以文件形式存在,您可以直接将其从数据库中取出。

      您还可以使用更新版本的 iText 重新编译 pdftk - 这样,您可以获得最新的 PDF 处理功能和 pdftk 的易用性。但是,您仍然需要一个 XFDF 文件。

      【讨论】:

        【解决方案3】:

        “你可以从你的 Java 访问你的数据”——说起来容易做起来难 :)))))

        我用 Java 编写了一个命令行实用程序,以及一个 php 示例,如何在服务器端动态填充 pdf 表单(没有文件写入磁盘)并将填充的 pdf 文档提供给浏览器: https://sourceforge.net/projects/pdfformfiller2/

        它的输入格式比 XFDF 简单得多。
        php示例中提供了转义(编码)功能。
        它修复了 Adob​​e Reader UTF-8 支持中的一个错误。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-28
          • 2016-07-08
          • 1970-01-01
          • 2012-04-09
          • 2016-06-07
          • 1970-01-01
          相关资源
          最近更新 更多