Объединить 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.

Другие вопросы по тегам