объединить XFDF с PDF-формой для создания окончательного PDF-серверной части? - PullRequest
2 голосов
/ 17 января 2010

Вот что у меня сейчас:

  • Пользователь отправляет данные формы и получает ссылку "скачать PDF".

  • Ссылка указывает на скрипт, который на лету создает файл XFDF и выводит файл XFDF после установки соответствующих заголовков и т. Д.

  • Файл XFDF указывает на PDF-файл, защищенный паролем, который является общей формой PDF, в которой для заполнения полей используются данные XFDF.

Что бы я хотел:

  • Пользователь нажимает ссылку "скачать PDF".

  • XFDF генерируется на лету (файл не записывается на сервер).

  • PDF и XFDF объединяются на стороне сервера с использованием универсального PDF. Содержимое окончательного PDF-файла выводится пользователю так же, как изначально было XFDF.

  • Ни XFDF, ни окончательный PDF никогда не сохраняются на сервере.

Я смотрел на pdftk , в котором есть несколько опций для работы с файлами FDF / XFDF, но все они предполагают, что а) исходный файл XFDF существует в виде файла на сервере и б) что полученный PDF-файл должен быть выведен в виде файла на сервере.

Также pdftk 4 года.

Мне было интересно, если:

а) там был более новый эквивалент pdftk?

b) если был способ, используя более новый pdftk-подобный инструмент или используя pdftk, использовать динамические пути, чтобы данные никогда не существовали в форме файла на сервере?

Я недавно узнал о встроенных потоках ввода / вывода, используя php://, но я все еще не совсем уверен, как его использовать, но, возможно, это было бы хорошим местом для этого?

Ответы [ 3 ]

1 голос
/ 08 июня 2011

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

}

1 голос
/ 29 июня 2010

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

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

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

0 голосов
/ 20 мая 2012

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

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

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

...