创建/填写印刷表格和pdf的最佳方式?

Bee*_*eep 12 c# pdf adobe pdf-generation

我们有一个C#应用程序,必须打印复杂的表单.多页政府合规表格必须采用特定格式.我们可以获取这些表单的PDF副本并创建表单字段,但不确定如何填写此数据并创建可以自动打印并发送给客户的PDF(他们需要纸质副本).

此外,某些表单是动态的,因为必须重复某些页面(例如,对于员工平等机会审计报告,如果它拥有50名员工但客户端有250个,我们可能需要在表单中包含5个页面副本).

一般来说,填充和打印这些表单的最佳方法是什么?请注意,我们的应用程序是基于C#的,但欢迎任何语言/应用程序中的任何解决方案(我们愿意购买软件或在需要时与其他框架集成).

例如 - TurboTax会用什么来打印出它处理的数百种税表?

Mar*_*rer 10

这里有几种选择.

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
Run Code Online (Sandbox Code Playgroud)

"/ V"表示字段值,"/ T"是字段的标题."/ F"是要填写的表单的路径.

周围有许多邮件合并式产品,可以接收FDF和PDF并生成填写的PDF表单.前面提到的iText(和其他几个)可以通过编程方式执行此操作,其他应用程序具有命令行.

在这种环境中,任何可能需要重复的页面都应该是它自己的形式.合并表单可能非常难.有几种方法,最简单的方法是"扁平化"字段,使它们只是页面内容(艺术线条和文本)......然后你就不再真正合并PDF格式了.

当然,如果您可以控制打印内容的顺序,则根本不需要合并表单.您可以按正确的顺序打开/打印它们.

我记得,Acrobat Pro的批处理命令可以导入FDF数据和打印.您需要做的就是生成相应的FDF文件,这主要是简单的字符串构建.

使用FDF假设您已经制作了PDF表格,等待填写.如果不是这样的话......

2)以编程方式生成PDF表单.我用iText(iTextSharp的Java基础)做到这一点,尽管有不少语言提供的库.iText [夏普]是根据AGPL(或商业)许可的.使用AGPL,任何有权访问您的OUTPUT的人都必须能够访问您的应用程序源.AGPL与常规GPL一样"病态".MPL提供旧版本.

鉴于这是严格内部的,您将打印PDF,许可证不是问题.

生成表单模板然后直接或通过FDF填充它们会更有效率.


Kev*_*ith 7

您可以使用最近创建的Kevsoft.PDFtk包来封装 PDFtk 服务器。

var pdftk = new PDFtk();

var fieldData = new Dictionary<string, string>()
{
   ["Best Coding Website Box"] = "Stackoverflow",
   ["My Check Box"] = "Yes"
};

var result = await pdftk.FillFormAsync(
   pdfFile: await File.ReadAllBytesAsync("myForm.pdf"),
   fieldData: fieldData,
   flatten: false,
   dropXfa: false
);

if(result.Success)
{
    await File.WriteAllBytes($"{Guid.NewGuid()}.pdf", result.Result);
}
Run Code Online (Sandbox Code Playgroud)

GitHub 页面上还有更多相同内容 - https://github.com/kevbite/Kevsoft.PDFtk

此外,此博客文章还有额外信息 - https://kevsoft.net/2021/05/16/filling-pdf-forms-for-free-with-dotnet-core-and-net-5.html

Kevsoft.PDFtk 已获得 MIT 许可

PDFtk Server 根据 GPLv2 获得许可,但是,如果您要打包要分发的应用程序,则可以购买重新分发许可证。