A melhor maneira de criar / preencher formulários impressos e pdfs?

Temos uma aplicação C# que tem de imprimir formas complexas. Coisas como formulários de Conformidade de várias páginas do governo que devem estar em um formato específico. Podemos obter cópias em PDF destes formulários e criar campos de formulários, mas não temos a certeza de como preencher estes dados e criar um PDF que pode ser auto-impresso e enviado para os nossos clientes (eles precisam de cópias em papel).

Além disso, algumas das formas são dinâmicas, na medida em que certas páginas devem ser repetidas (por exemplo, para um trabalhador igual relatório de auditoria de oportunidade podemos precisar incluir 5 cópias de uma página no formulário, se ele tem 50 funcionários, mas o cliente tem 250).

Em geral, Qual é a melhor maneira de povoar e imprimir estes formulários? Note que nossa aplicação é C#-based, mas qualquer solução em qualquer idioma / aplicativo é bem-vindo (estamos abertos a comprar software ou integrar com outros frameworks, se necessário).

Por exemplo, o que algo como TurboTax usaria para imprimir as centenas de formulários fiscais que lida?

Author: Beep beep, 2011-06-14

8 answers

Há várias opções aqui.

1) FDF, formato dos dados do formulário . E esse é um documento de especificações terrível, ele só cobre uma pequena (pouco usada, complicada) parte do formato FDF. Os arquivos FDF são bastante triviais de gerar, e contêm uma pilha de pares de campos/valores (e podem conter opções de lista, e outras coisas mais extravagantes que você não vai precisar) e uma associação de arquivos. Abrir o FDF preenche o PDF (através de uma associação de arquivos com acrobat/reader).

Aqui está uma amostra. espaço em branco extra para torná-lo mais legível):
%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 "indica um valor de campo," /T " é o título de um campo. "/F " é o caminho para o formulário a preencher.

Há uma série de produtos mail-merge-esque flutuando ao redor que podem pegar em um FDF e PDF e produzir um formulário PDF preenchido. O iText acima mencionado (e vários outros) pode fazer isso programaticamente, outros aplicativos têm linhas de comando.

Qualquer página que precise de ser repetida deve ser na sua forma. ambiente. Juntar formulários pode ser muito difícil. Existem algumas abordagens, a mais fácil delas é "achatar" os campos para que eles são apenas conteúdo de página (line art & text)... então já não estás a fundir formulários PDF. É claro que se você pode controlar a ordem em que as coisas são impressas, você não precisa fundir os formulários. Você poderia apenas abri-los / imprimi-los na ordem correta.

Se bem me lembro, os comandos de lote do Acrobat Pro podem importar dados FDF e imprimir. All you'd a necessidade de fazer seria gerar os arquivos FDF apropriados, que é principalmente construção de string trivial.

Usando o FDF presume que você tem os formulários PDF já feitos, apenas esperando para ser preenchido. Se não for esse o caso...

2) Gerar as suas formas PDF programaticamente. Eu faço isso com iText (a base Java do iTextSharp), embora haja algumas bibliotecas disponíveis em várias linguagens. a iText [Sharp] é licenciada ao abrigo da AGPL (ou comercialmente). Com AGPL, qualquer um com acesso para a sua saída deve ter acesso à fonte de sua aplicação. A AGPL é tão "viral" quanto a GPL normal. Versões mais antigas estavam disponíveis sob o MPL.

Dado que isto é estritamente interno e que vão imprimir os PDFs, o licenciamento não é um problema.

Seria consideravelmente mais eficiente gerar os modelos de formulários assim que os preenchesse... directamente ou via FDF.

 12
Author: Mark Storer, 2011-06-14 17:25:17

Pode tentar Docótico.Pdf Library . Esta biblioteca permite preencher formulários em documentos existentes, importar e exportar dados FDF, bem como modificar documentos existentes e criar formulários a partir do zero.

Várias amostras:

Como preencher os formulários existentes

Como importar o FDF para o documento PDF

Como criar campos de texto

Docótico.Pdf vem com licenças comerciais e livres.
 2
Author: Vitaliy Shibaev, 2011-06-15 12:13:38

Se a sua forma se baseia na tecnologia AcroForm: basta usar o itext7 para realizar esta tarefa. Adicione-o ao seu projecto, executando o seguinte comando na sua Consola do Gestor de Pacotes NuGet:

Install-Package itext7

Para escrever um campo de formulário específico, use um código semelhante a este:

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();

Neste trecho, src é a fonte de um ficheiro PDF e dest é o caminho para o PDF resultante. O key corresponde ao nome de um campo em o seu modelo. O value corresponde ao valor que deseja preencher. Se você quiser que o formulário mantenha sua interatividade, você precisa remover o form.flattenFields(); caso contrário todos os campos do formulário serão removidos, resultando em um PDF plano.

Atenção

Esteja ciente de que o itext7 é licenciado sob a AGPL e não é gratuito para uso comercial ou fonte fechada. (agradecimentos especiais a @da_berni por esta informação necessária)

 1
Author: WoIIe, 2019-08-19 14:49:05

A resposta parcial à sua pergunta é que você deve explorar a biblioteca "ItextSharp", que é uma biblioteca de código aberto e é útil na criação de arquivos PDF.

Http://sourceforge.net/projects/itextsharp/

 0
Author: Deepesh, 2011-06-14 05:34:11
  1. Imprimir o formato PDF (em alta qualidade)
  2. digitaliza-o (em alta qualidade)
  3. converter um ficheiro digitalizado num mapa de bits (*.dib)
  4. Usando C Visual (VS 2010, programaticamente)
    • defina as propriedades da página (ou seja, prepare a página, o contexto do dispositivo, etc...)
    • crie as suas fontes (quantas quiser, claro)
    • Defina a origem da página (topo da Página)
    • carregar e usar StretchDIBits (ou semelhantes) para imprimir a imagem da página PDF
    • Vá para o topo de Página
    • calcule a sua posição de impressão (pt.x and pt.y)
    • imprimir usando pDC - >TextOut (ou o que mais quiser usar)

O acima funciona com qualquer número de campos em qualquer página PDF, mas requer alguns conhecimentos rudimentares dos processos de impressão so subjacentes. Ele lhe dá o controle total da página e isso significa que você pode riscar, imprimir, etc.... podes fazer o que quiseres.
Não vejo qualquer problema em converter isso para VS 2017 e C#. Sem necessidade de biblioteca - apenas codificação à moda antiga à mão.

 0
Author: Manfred, 2018-01-17 04:25:22
Usamos aspose.palavras e eu vejo que eles têm um PDF API também.
 0
Author: Mark Smith, 2018-06-28 02:30:17

A partir de 2020 livre.PDF parece interessante. Citando o site https://www.e-iceblue.com/Introduce/free-pdf-component.html:

Pinça Grátis.PDF for. NET é uma edição comunitária da Spire.PDF for .NET, que é uma API totalmente livre PDF para uso comercial e pessoal. Como uma biblioteca independente, Free Spire.PDF for. Net permite aos desenvolvedores criar, escrever, editar, converter, imprimir, manipular e ler arquivos PDF em qualquer. net( C#, VB.NET, ASP.NET, .NET Core) aplicacao.

Parece que está limitado a 10 páginas no máximo.
 0
Author: Mark Willis, 2020-07-22 07:11:29

Tenta com isto:

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();
}
 -3
Author: Gurumurthy143, 2019-04-11 14:07:15