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

如何解决创建/填写印刷表格和pdf的最佳方法?

| 我们有一个必须打印复杂表格的C#应用​​程序。必须采用特定格式的多页政府合规性表格之类的内容。我们可以获取这些表单的PDF副本并创建表单字段,但是不确定如何填写此数据并创建可以自动打印并发送给客户的PDF(它们需要纸质副本)。 此外,某些表格是动态的,其中某些页面必须重复(例如,对于员工机会平等审计报告,如果该页面可容纳50名员工,但客户有250名,则可能需要在该表单中包含该页面的5份副本)。 通常,填充和打印这些表格的最佳方法是什么?请注意,我们的应用程序基于C#,但是欢迎使用任何语言/应用程序的任何解决方案(我们愿意购买软件或在需要时与其他框架集成)。 例如-像TurboTax这样的东西会用来打印出它处理的数百种报税表吗?     

解决方法

        这里有几个选项。 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(以及其他几个iText)可以以编程方式执行此操作,其他应用程序则具有命令行。 在这种环境下,任何可能需要重复的页面都应该是它自己的形式。合并表单可能非常困难。有两种方法,最简单的方法是“平整”字段,使它们仅是页面内容(线条和文字)...然后您就不再真正合并PDF表单了。 当然,如果您可以控制打印内容的顺序,则完全不需要合并表格。您可以按照正确的顺序打开/打印它们。 我记得,Acrobat Pro的批处理命令可以导入FDF数据并进行打印。您所需要做的就是生成适当的FDF文件,这主要是琐碎的字符串构建。 使用FDF假定您已经制作了PDF表单,只是在等待填写。如果不是这种情况... 2)以编程方式生成PDF表单。我使用iText(iTextSharp的Java基础)进行此操作,尽管有许多可用的各种语言的库。 iText [Sharp]已根据AGPL(或商业)获得许可。使用AGPL,有权访问您的输出的任何人都必须有权访问您的应用程序的源。 AGPL与常规GPL一样“病毒”。 MPL下提供了较旧的版本。 鉴于这完全是内部的,并且您将要打印PDF,因此许可并不是什么大问题。 一次生成表单模板,然后直接或通过FDF填写表单模板,效率将大大提高。     ,        您可以尝试Docotic.Pdf库。该库允许在现有文档中填写表格,导入和导出FDF数据,以及修改现有文档并从头开始创建表格。 几个样本: 如何填写现有表格 如何将FDF导入PDF文档 如何建立文字栏位 Docotic.Pdf带有商业和免费许可证。     ,如果您的表单基于AcroForm技术:只需使用itext7完成此任务。通过在NuGet软件包管理器控制台中执行以下命令,将其添加到项目中:   安装包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。 警告 请注意,itext7是根据AGPL许可的,并非免费用于商业用途或封闭源。 (特别感谢@da_berni提供此必要信息)     ,        对于您的问题的部分答案是,您应该探索\“ ItextSharp \”库,该库是一个开放源代码库,在创建PDF文件时很有用。 http://sourceforge.net/projects/itextsharp/     ,         打印PDF表格(高质量) 扫描(高质量) 将扫描的文件转换为位图(* .dib) 使用Visual C(VS 2010,以编程方式) 设置页面属性(即,准备页面,设备上下文等) 创建您的字体(当然,您可以随意设置) 设置页面原点(页面顶部) 加载并使用StretchDIBits(或类似方法)以打印PDF页面图像 转到页面顶部 计算您的打印位置(pt.x和pt.y) 使用pDC-> TextOut(或其他任何您想使用的东西)打印 以上内容适用于任何PDF页面上的任意多个字段,但需要 基本的操作系统打印过程的一些基本知识。 它使您可以完全控制页面,这确实意味着您可以划线,打印等等。 我认为将其转换为VS 2017和C#毫无问题。 无需库-只需手工简单的老式编码。     ,        我们使用aspose.words,我也看到它们也有PDF API。     ,        试试这个:
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();
}
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res