将XFDF与PDF格式合并以创建最终的PDF服务器端?

时间:2010-01-17 09:19:08

标签: php pdf streaming pdftk xfdf

这就是我目前的情况:

  • 用户提交表单数据并获取“下载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://了解了内置的输入/输出流,但我对如何使用它仍然很模糊,但也许这对它来说是一个好地方?

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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 :(得分:0)

“你可以从你的Java访问你的数据” - 很容易说难以做到:)))))

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

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