【问题标题】:C# PDF library to manipulate PDF用于操作 PDF 的 C# PDF 库
【发布时间】:2016-08-23 08:36:25
【问题描述】:

我们的医疗仪器会生成患者数据和图像。医院希望收到包含患者详细信息和图像的 PDF 文档,格式非常特定 - A4 页面、特定位置的条形码、特定页边距等。

我不想在代码中从空白画布逐行组装此 PDF,因为如果这样做,我将不得不编写数千行代码,而且当我们有不同的客户需要不同的格式时那么我们需要再次重写这数千行代码。而且,如果客户想要对格式进行小幅更改,我们需要发布新版本。

我想以“邮件合并”的方式进行:我创建了一个报告模板、一个包含条码、页眉和页脚以及所有其他静态内容的完整文档。模板中有患者详细信息和图像的特殊占位符,例如“[@PatinetFirstName@]”、“[@PatientLastName@]”、“[@PatientPreviousVisitsTable@]”……然后,对于每个患者,我的代码会复制这个模板,找到那些特殊的占位符,并用真实的数据或图像替换它们。这样,如果不同的客户想要不同的格式,我只需要编辑这个模板,我的代码保持不变。

这意味着我需要能够使用此库在现有 PDF 中进行搜索和替换,在任何位置插入段落、表格和图像,并能够指定段落和表格的格式以及大小和图像的分辨率。

我该怎么做?我的意思是,是否有允许我这样做的 C# API?

【问题讨论】:

  • 请记住,PDF 是一种排版格式,并不是真正为轻松处理文本而设计的。您可能需要考虑使用中间格式(例如 DOCX),以该格式进行替换,然后将生成的文档发送到外部 PDF 转换器(可以是打印机驱动程序或独立程序,尽管后者通常是专有的并且许可费用昂贵)。
  • 我同意布拉德利的观点,这实际上是这类任务的典型完成方式。您以流文档类型(如 DOCX 或 HTML 或 ...)创建输入模板文档,并在处理后将其转换为固定文档类型(如 PDF 或 XPS 或 ...)。如果您有兴趣,GemBox.Document 库可以让您轻松加载输入模板,对其执行邮件合并并将其保存为生成的 PDF 文件,如 example 所示。

标签: c# pdf


【解决方案1】:

你可以试试https://sourceforge.net/projects/itextsharp/。一个出色的库,可以直接从创建、更新和许多其他功能对 PDF 执行任何操作。还可以添加图像、段落和表格。

【讨论】:

    【解决方案2】:

    我通过创建带有占位符的 txt 文件解决了同样的任务:

    This contract is an agreement between {renter}, who will be renting a house from {owner}, who owns the house being rented. 
    {paragraphbreak}
    The owner agrees to rent the house in its present condition located at {address} to the renter under this terms.
    {paragraphbreak}
    

    并创建了另一个文件contract_dictionary.json,其中包含可以在客户之间更改的json:

    [
      {
        "Key": "renter",
        "Value": "John Smith"
      },
      {
        "Key": "owner",
        "Value": "Samanta Jackson"
      },
    

    然后在我的代码中,我将 tempate 中的占位符替换为 json 中的值:

            ContractContent = ContractContent.ConvertAll(c => c.Replace("{paragraphbreak}", " "));
            foreach (ContractDictionary item in DictionaryData)
            {
                ContractContent = ContractContent.ConvertAll(c => c.Replace("{" + item.Key + "}", item.Value));
            }
    

    然后,将其渲染成 PDF 文件:

    using Gehtsoft.PDFFlow.Builder;
    var s = builder.AddSection();
    foreach (var paragraph in ContractContent)
                s.AddParagraph(paragraph).SetFont(DocumentFont).SetJustifyAlignment(true);
    

    这是该解决方案的源代码和描述性文章:HouseRentalContract

    要编译上述示例,您需要将Gehtsoft.PDFFlowLib 添加到您的项目中。

    希望,这会有所帮助。

    【讨论】:

    • 这个解决方案本质上是一个配方,可以在最后使用任何 PDF 库(或至少大部分),因为它适用于实际的 PDF 模板(如所问由 OP 在他们的问题中表示)但使用纯文本,然后在 PDF 中绘制。
    【解决方案3】:

    我建议您查看Html Renderer for PDFSharp (NuGet)。您可以使用它来将 Html 转换为 PDF。

    这意味着您可以将模板(包括@占位符)保留在数据库中,并使用值动态填充 Html 模板并将其转换为 PDF。如果以后需要更改格式,只需更改 Html 模板即可。

    关于搜索和替换,如果您在转换为 PDF 之前存储了 Html 标记,您可以在 Html 标记中进行搜索和替换,然后从新的 Html 标记重新生成 PDF。

    生成 PDF 以发送给客户。但是为所有其他系统处理处理原始 Html。

    【讨论】:

    • 感谢您的帮助!我认为这是正确的方法!
    猜你喜欢
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多