【问题标题】:Generating PDF from json and json-schema从 json 和 json-schema 生成 PDF
【发布时间】:2018-09-23 07:23:41
【问题描述】:

我们目前正在使用 Alpaca Forms 生成表单,用于编辑存储在 json 中的数据以用于我们的应用程序。我们现在正在寻找一种方法来在服务器端使用 json-schema 和 json.xml 生成 PDF 文档。

理想情况下,这将使用 C#,但坦率地说,我们真的可以使用任何语言,只要我们可以将它放在 Web 服务后面。

基本上,它将是 Alpaca,但输出将是 PDF 报告,其中可能包含封面和其他文档友好功能。它还将使用 json-schema 中的“标题”和“描述”字段。

除了尝试推出我们自己的想法之外,还有什么想法吗?我宁愿不使用 PDF 库,因为大多数似乎都不是面向文档的。

【问题讨论】:

    标签: json pdf pdf-generation jsonschema


    【解决方案1】:

    wkhtmltopdf 是我个人最喜欢的方式。您应该能够将您的 JSON 模式转换为 HTML,然后通过它呈现它。

    【讨论】:

    • 问题是 HTML 在“报告”方面并不是很好。即它没有分页符、页码、封面等的概念。
    【解决方案2】:

    如果您使用的是 Node:您可以使用 Chromium 的(开源 Chrome 浏览器)Puppeteer 启动无头浏览器,服务器端,可以生成 PDF。

    const puppeteer = require('puppeteer');
    const browser = await puppeteer.launch({headless: true});
    const page = await browser.newPage();
    page.setContent('<h1>My PDF!</h1>');
    const myPdf = page.pdf();
    

    从 Puppeteer 生成时,请参阅https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagepdfoptions 了解更多 PDF 选项

    我没有测试上面的代码,但这是我用来生成 PDF 的基础知识

    需要npm i puppeteer :)

    【讨论】:

      【解决方案3】:

      将 Alpaca Forms JSON 自动转换为按您想要的方式布置页面的东西可能很困难(不可能?)。例如,Alpaca JSON 是否提供足够的信息来确定页面大小、方向、页眉、页脚、编号位置和样式等?

      Docmosis 可能对您有用(请注意我为 Docmosis 工作)。您可以在文字处理器文档中布局您的 PDF,并调用 Docmosis 将其与您的 JSON 数据合并以创建 PDF。模板中的字段驱动数据提取,因此您可以将 放入模板中,标题将从 JSON 中提取。在 Alpaca 的情况下,标题可能在 JSON 中的“模式”下键入,因此您将在 Docmosis 模板中使用 。页面布局和样式来自模板。将其作为候选解决方案进行测试的最快方法是创建一个云帐户、上传一个模板并使用您的 JSON 调用 REST API 来创建文档。如果这能满足您的需求,您可以选择云或本地选项。

      希望对你有帮助。

      【讨论】:

        【解决方案4】:

        如果最适合你的是 C#,那么你需要从 json 生成 PDF:

        1. 将 JSON 解析为某个 C# 集合;
        2. 循环收集数据并将数据写入 PDF 表;
        3. 将文件另存为 PDF。 为此,您将需要一些 PDF 创建库。 下面是一个例子,如何在 C# 中使用 PDFFlow 库来实现它:

        准备存储数据的类:

        public sealed class ReportData
        {
            public string name { get; set; }
            public string surname { get; set; }
            public string address { get; set; }
        }
        

        从 JSON 中读取数据到集合中:

        string jsonFilePath = Path.Combine(SubfolderName, JSONFileName);
        List<ReportData> jsonData = JsonSerializer.Deserialize<List<ReportData>>(File.ReadAllText(jsonFile));
        

        创建 PDF 文档并添加表格:

        using Gehtsoft.PDFFlow.Builder;
        var section = DocumentBuilder.New().AddSection();
        var table = section.AddTable();
        table
            .AddColumnToTable("Name", 150)
            .AddColumnToTable("Surname", 250)
            .AddColumn("Address", 300);
        

        遍历集合并将数据添加到表中:

        foreach(var rowData in jsonData)
        {
            var row = table.AddRow();
            row
                .AddCellToRow(rowData.name)
                .AddCellToRow(rowData.surname)
                .AddCell(rowData.address);
        }
        

        将文档保存为 PDF 文件:

        section
            .ToDocument()
                .Build("Result.PDF");
        

        要编译此代码,您需要在项目中添加对 PDFFlow 库的引用。

        希望,这会有所帮助。

        这是一个完整的 PDF 合同生成示例,演示了如何使用 JSON 作为数据源:contract example

        【讨论】:

        • 这不是表格数据,这就是它复杂的原因。 Alpaca 是一个表单库,它使用结构化 json 模式构建具有层次结构的表单。
        猜你喜欢
        • 1970-01-01
        • 2015-03-07
        • 1970-01-01
        • 2014-03-20
        • 2014-01-17
        • 1970-01-01
        • 1970-01-01
        • 2022-01-17
        • 1970-01-01
        相关资源
        最近更新 更多