Объединить XFDF с PDF-формой для создания окончательного PDF-файла на стороне сервера?
Вот что у меня сейчас:
Пользователь отправляет данные формы и получает ссылку "скачать PDF".
Ссылка указывает на скрипт, который генерирует файл XFDF на лету и выводит файл XFDF после установки соответствующих заголовков и т. Д.
Файл XFDF указывает на PDF-файл, защищенный паролем, который является общей формой PDF, которая использует данные XFDF для заполнения полей.
Что бы я хотел:
Пользователь нажимает ссылку "скачать PDF".
XFDF генерируется на лету (файл не записывается на сервер).
PDF и XFDF объединяются на стороне сервера с использованием универсального PDF. Содержимое окончательного PDF-файла выводится пользователю так же, как изначально было XFDF.
Ни XFDF, ни окончательный PDF никогда не сохраняются на сервере.
Я смотрел на pdftk, у которого есть несколько опций для работы с файлами FDF/XFDF, но все они предполагают, что а) исходный файл XFDF существует в виде файла на сервере и б) что полученный PDF должен быть выведен как файл на сервере.
Также pdftk 4 года.
Мне подумалось, может:
а) там был более новый эквивалент pdftk?
б) если был способ, используя более новый pdftk-подобный инструмент или используя pdftk, использовать динамические пути, чтобы данные никогда не существовали в виде файла на сервере?
Недавно я узнал о встроенных потоках ввода / вывода, используя php://
но я все еще не очень понимаю, как его использовать, но, может быть, это было бы хорошим местом для этого?
3 ответа
Я сам воспользовался советом Хкремера и создал небольшой exe.net на C#, чтобы создать PDF-файл из xfdf-файла на основе библиотеки itextsharp. Его все равно нужно будет вызывать с помощью 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();
}
}
}
Есть коммерческие приложения, которые делают это (вы можете найти некоторые на pdfstore.com), но с некоторым программированием вы можете создавать свои собственные, используя ту же библиотеку, которую pdftk использует для обработки файлов PDF: iText ( http://itextpdf.com/) Существует также версия.NET - iTextSharp.
Делая это, вы можете получить доступ к своим данным из вашей программы Java или.NET, и они никогда не должны существовать в виде файла, вы можете получить их непосредственно из базы данных.
Вы также можете перекомпилировать pdftk с новой версией iText - таким образом, вы сможете использовать новейшие возможности обработки PDF и простоту использования, которую вы имеете с pdftk. Однако вам все равно понадобится файл XFDF.
"Вы можете получить доступ к своим данным из вашей Java" - легко сказать, трудно сделать:)))))
Я написал утилиту командной строки на Java и пример php, как динамически заполнять pdf-формы на лету (файлы не записываются на диск) на стороне сервера и подавать заполненные pdf-документы в браузер: https://sourceforge.net/projects/pdfformfiller2/
Его формат ввода намного проще, чем XFDF.
Функция выхода (кодирования) представлена в примере с php.
Это исправляет ошибку в поддержке Adobe Reader UTF-8.