Лучший способ создать / заполнить печатные формы и PDF-файлы? - PullRequest
12 голосов
/ 14 июня 2011

У нас есть приложение на C #, которое должно печатать сложные формы.Такие вещи, как многостраничные правительственные формы соответствия, которые должны быть в определенном формате.Мы можем получить копии этих форм в PDF-формате и создать поля форм, но не уверены, как заполнить эти данные и создать PDF-файл, который можно автоматически распечатать и отправить нашим клиентам (им нужны бумажные копии).

Кроме того, некоторые формы являются динамическими, поскольку некоторые страницы должны повторяться (например, для отчета о проверке равных возможностей сотрудника нам может потребоваться включить в форму 5 копий страницы, если она содержит 50сотрудников, но у клиента 250).

В общем, как лучше заполнить и распечатать эти формы?Обратите внимание, что наше приложение основано на C #, но любое решение на любом языке / приложении приветствуется (мы открыты для покупки программного обеспечения или интеграции с другими платформами, если это необходимо).

Например - что-то вроде TurboTaxиспользовать, чтобы распечатать сотни налоговых форм, которые он обрабатывает?

Ответы [ 7 ]

11 голосов
/ 14 июня 2011

Здесь есть несколько вариантов.

1) FDF, Формат данных формы .И это ужасный документ спецификации, он охватывает только небольшую (редко используемую, сложную) часть формата FDF.Файлы FDF довольно просты в создании и содержат кучу пар поле / значение (и могут содержать параметры списка и другие более интересные вещи, которые вам не понадобятся) и сопоставление файлов.Открытие FDF заполняет PDF (через сопоставление файлов с acrobat / reader).

Вот пример (с дополнительным пробелом, чтобы сделать его более читабельным):

%FDF-1.2
1 0 obj
<< /FDF
  << /Fields  [
    << /V (Communications Co.)/T (Address1)>>
    << /V (29 Communications Road)/T (Address2)>>
    << /V (Busyville)/T (City)>>
    << /V (USA)/T (Country)>>
    << /V (24 January 2000)/T (Date)>>
    << /V (Suzie Smith)/T (Name)>>
    << /V (\(807\) 221-9999)/T (PhoneNumber)>>
    << /V (777-11-8888)/T (SSN)>>
    << /V (NJ)/T (State)>>
  ]
  /F (TestForm.pdf)
  >>
>>
endobj
trailer
<<
  /Root 1 0 R
>>
%%EOF

"/ V"указывает значение поля, "/ T" - заголовок поля.«/ F» - это путь к форме, которую нужно заполнить.

Существует множество продуктов с поддержкой слияния, которые могут принимать FDF и PDF и создавать заполненную форму PDF.Вышеупомянутый iText (и некоторые другие) могут делать это программно, другие приложения имеют командные строки.

Любая страница, которую, возможно, потребуется повторить, должна иметь свою собственную форму в этой среде.Слияние форм может быть довольно сложным.Есть пара подходов, самый простой из которых состоит в том, чтобы «сгладить» поля, чтобы они были просто содержимым страницы (штриховой рисунок и текст) ... тогда вы больше не объединяете PDF-формы.

Конечно, если вы можете контролировать порядок печати, вам не нужно вообще объединять формы.Вы можете просто открыть / распечатать их в правильном порядке.

Насколько я помню, пакетные команды Acrobat Pro могут импортировать данные FDF и печатать.Все, что вам нужно сделать, это сгенерировать соответствующие файлы FDF, что в основном является тривиальным построением строк.

Использование FDF предполагает, что у вас уже есть PDF-формы, просто ожидающие заполнения.Если это не так ...

2) Создайте PDF-формы программно.Я делаю это с помощью iText (Java-основа iTextSharp), хотя существует довольно много библиотек, доступных на разных языках.iText [Sharp] лицензируется в соответствии с AGPL (или коммерчески).С AGPL любой, имеющий доступ к вашему OUTPUT, должен иметь доступ к источнику вашего приложения.AGPL такой же «вирусный», как и обычный GPL.Более старые версии были доступны под MPL.

Учитывая, что это сугубо внутреннее и вы будете печатать PDF-файлы, лицензирование не представляет особой проблемы.

Было бы значительно эффективнее сгенерировать шаблоны форм один раз.затем заполните их ... напрямую или через FDF.

3 голосов
/ 15 июня 2011

Вы можете попробовать Docotic.Pdf Library .Эта библиотека позволяет заполнять формы в существующих документах, импортировать и экспортировать данные FDF, а также изменять существующие документы и создавать формы с нуля.

Несколько образцов:

Как заполнятьсуществующие формы

Как импортировать FDF в документ PDF

Как создавать текстовые поля

Docotic.Pdfпоставляется с коммерческими и бесплатными лицензиями.

1 голос
/ 11 апреля 2019

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

Install-Package itext7

Чтобы написать определенное поле формы, используйте код, подобный этому:

PdfReader reader = new PdfReader(src);
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdfDoc = new PdfDocument(reader, writer);
var form = PdfAcroForm.GetAcroForm(pdfDoc, true);
var fields = form.GetFormFields();
fields.Get(key).SetValue(value);
form.FlattenFields();
pdfDoc.Close();

В этом фрагменте src является источником файла PDF, а dest - это путь к полученному PDF.key соответствует названию поля в вашем шаблоне.value соответствует значению, которое вы хотите заполнить. Если вы хотите, чтобы форма сохраняла свою интерактивность, вам нужно удалить form.flattenFields();, в противном случае все поля формы будут удалены, что приведет к получению плоского PDF.

1 голос
/ 17 января 2018
  1. Печать PDF-формы (в высоком качестве)
  2. Сканирование (в высоком качестве)
  3. Преобразование отсканированного файла в растровое изображение (* .dib)
  4. С помощью Visual C (VS 2010, программно)
    • установить свойства страницы (т. Е. Подготовить страницу, контекст устройства и т. Д.) *
    • создать свои шрифты (сколько угодно, конечно)
    • установить источник страницы (начало страницы)
    • загрузить и использовать StretchDIBits (или аналогичные) для печати изображения страницы PDF
    • перейти к началу страницы
    • вычисление вашей позиции печати (pt.x и pt.y)
    • печать с использованием pDC-> TextOut (или чего-либо еще, что вы хотите использовать)

Вышесказанное работает с любым количеством полей на любой странице PDF, но требует некоторых элементарных знаний о процессах печати базовой ОС.Это дает вам полный контроль над страницей, а это означает, что вы можете вычеркнуть, распечатать и т. Д. ... вы можете делать все, что захотите.
Я не вижу никаких проблем при конвертации этого в VS 2017 и C #.Библиотека не нужна - просто старомодное кодирование вручную.

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

Частичный ответ на ваш вопрос заключается в том, что вам следует изучить библиотеку «ItextSharp», которая является библиотекой с открытым исходным кодом и полезна при создании PDF-файлов.

http://sourceforge.net/projects/itextsharp/

0 голосов
/ 28 июня 2018

мы используем aspose.words, и я вижу, что у них также есть PDF API .

0 голосов
/ 09 июня 2018

Попробуйте с этим:

string Filepath = Server.MapPath("/AOF.pdf");
var pdfpath = Path.Combine(Filepath, "");
var Formcontent = ListFieldNames(Filepath);
Formcontent["Name_txt"] =  "T.Test" ;  FillForm(Formcontent); //  var pdfContents = FillForm(pdfpath, Formcontent);

public Dictionary<string, string> ListFieldNames(string Filepath)
{
    //PdfReader pdfReader = new PdfReader(pdfTemplate);
    //StringBuilder sb = new StringBuilder();
    //foreach(DictionaryEntry de in pdfReader.AcroFields.Fields)
    //{
    //    sb.Append(de.Key.ToString() + Environment.NewLine);
    //}
    var Fileds = new Dictionary<string, string>();
    PdfReader pdfReader = new PdfReader(Filepath);
    var reader = new PdfReader(pdfReader);
    foreach (var entry in reader.AcroFields.Fields)
        Fileds.Add(entry.Key.ToString(), string.Empty);
    reader.Close();
    return Fileds;
}

public byte[] FillForm(string pdfPath, Dictionary<string, string> formFieldMap)
{
    var output = new MemoryStream();
    var reader = new PdfReader(pdfPath);
    var stamper = new PdfStamper(reader, output);
    var formFields = stamper.AcroFields;
    foreach (var fieldName in formFieldMap.Keys)
        formFields.SetField(fieldName, formFieldMap[fieldName]);
    stamper.FormFlattening = true;
    stamper.Close();
    reader.Close();
    return output.ToArray();
}

public void FillForm(Dictionary<string, string> Formfiledmap)
{
    string pdfTemplate = Server.MapPath("/AOF.pdf");
    string newFile = @"C:\Users\USer\Desktop\completed_fw4.pdf";
    PdfReader pdfReader = new PdfReader(pdfTemplate);
    PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(newFile, FileMode.Create));
    AcroFields pdfFormFields = pdfStamper.AcroFields;
    foreach (var fieldName in Formfiledmap.Keys)
        pdfFormFields.SetField(fieldName, Formfiledmap[fieldName]);
    pdfStamper.FormFlattening = true;
    pdfStamper.Close();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...