2

这是我目前拥有的:

  • 用户提交表单数据并获得“下载 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://但我仍然对如何使用它很模糊,但也许这将是一个好地方?

4

3 回答 3

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();            
    }
}

}

于 2011-06-08T04:46:35.320 回答
0

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

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

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

于 2010-06-29T10:54:39.720 回答
0

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

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

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

于 2012-05-20T14:33:15.263 回答