首页 文章

合并 XFDF 与 PDF 表格以创建最终的 PDF server-side?

提问于
浏览
2

这就是我目前所拥有的:

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

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

  • XFDF 文件指向 password-protected PDF,这是使用 XFDF 数据填充字段的通用 PDF 表单。

我想要的是什么:

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

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

  • PDF 和 XFDF 使用通用 PDF 合并 server-side。最终 PDF 的内容输出给用户与 XFDF 最初相同。

  • XFDF 和最终 PDF 都没有保存到服务器。

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

此外,pdftk 已有 4 年历史。

我想知道是否:

a)那里有一个更新的等同于 pdftk?

b)如果有一种方法,使用更新的 pdftk-like 工具或使用 pdftk,使用动态路径,以便数据永远不必以文件形式存在于服务器上?

我最近使用php://了解了 built-in input/output 流,但我对如何使用它仍然很模糊,但是这可能是个好地方吗?

3 回答

  • 1

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

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

    您还可以使用较新版本的 iText 重新编译 pdftk - 这样,您就可以获得最新的 PDF 处理功能以及 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();            
        }
    }
    

    }

  • 0

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

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

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

相关问题