объединение 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://, но я все еще не знаю, как его использовать, но, может быть, это было бы хорошее место для этого?


person Anthony    schedule 17.01.2010    source источник


Ответы (3)


Я сам последовал совету Хкремера и создал небольшой .net exe на 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();            
    }
}

}

person Michael A    schedule 08.06.2011

Существуют коммерческие приложения, которые делают это (вы можете найти их на pdfstore.com), но с помощью некоторого программирования вы можете создать свое собственное, используя ту же библиотеку, которую pdftk использует для обработки файлов PDF: iText (http://itextpdf.com/) Есть еще версия .NET - iTextSharp.

Делая это, вы можете получить доступ к своим данным из вашей программы Java или .NET, и они никогда не должны существовать в виде файла, вы можете получить их напрямую из базы данных.

Вы также можете перекомпилировать pdftk с более новой версией iText - таким образом вы получите новейшие возможности обработки PDF и простоту использования pdftk. Однако вам все равно понадобится файл XFDF.

person khkremer    schedule 29.06.2010

"вы можете получить доступ к своим данным с вашего Java" - легко сказать сложно :)))))

Я написал утилиту командной строки на Java и пример php, как динамически заполнять формы pdf (файлы не записываются на диск) на стороне сервера и передавать заполненные документы pdf браузеру: https://sourceforge.net/projects/pdfformfiller2/

Его входной формат намного проще, чем XFDF.
Функция экранирования (кодирования) представлена ​​в примере php.
Она исправляет ошибку в поддержке Adobe Reader UTF-8.

person Nikolay    schedule 20.05.2012