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