【问题标题】:How to save changes made on the pdf file using iText on ASP.NET?如何在 ASP.NET 上使用 iText 保存对 pdf 文件所做的更改?
【发布时间】:2017-11-05 05:15:55
【问题描述】:

我正在创建一个 Web 应用程序,它可以自动处理 PDF 的工作。

我目前正在 .NET 上测试 iText7 以测试它是否符合我们的需求。

现在的主要问题是保存从网页对文件所做的修改。

编辑

场景如下:我们每天处理数百个 PDF 表单。我们填写、修改、保存、打印等。我们目前使用的工具太复杂了。因此,我们要简化。

我测试了我可以从数据库中填写表格并从字段中提取信息。但是,填写完后,我们可能需要手动更改表单中的一些值,保存更改并写回数据库。

最简单的解决方案当然是填写,下载文件,在本地编辑和保存,重新上传文件到服务器,然后从更新的表格中提取值并填写数据库。它可以工作,但它包含太多手动工作,例如下载和重新上传。我的客户希望它自动化。

我尝试的另一种方法是在我的网络应用程序中显示 pdf 文档,使用按钮(在网页上)编辑并保存所有修改。但无法让我的按钮保存更新的 pdf 文档。我在 MVC 视图中显示了文件,如下所示: object data="@Url.Action("ShowPDFwithButton", "PdfTemplates", new { id = Model.FilledForm.id })"type="application/pdf">/object>

我想出的第三种方法是在我填写的表单中添加一个带有“保存”按钮的新页面。我希望 pdf 本身中的那个按钮来保存我的修改。之后,我只需提取已保存表单的值并更新数据库。我尝试使用此代码向我的“保存”按钮添加一些功能,但不明白如何让它保存更改和/或将更新的文件发送到我的操作控制器:button.SetAction(PdfAction.CreateSubmitForm("/PdfTemplates/SavePdf/" + pdfMetadata.id, null,PdfAction.SUBMIT_EXCL_F_KEY));

如果有人可以帮助使第二种和第三种方法发挥作用,我将不胜感激。或者可能提供其他方法。

【问题讨论】:

  • “从网页对文件进行的修改”是什么意思? iText 不是网络客户端技术。它可以在网络服务器上使用,但它应该是显而易见的,毕竟你有一些输出流或文件......
  • @mkl,场景如下:我从 db 自动填充 pdf 文件并在网页上显示结果。现在我希望我的用户能够编辑它并保存将更新数据库的更改。如果它不是 itext 的功能,您能否建议我如何实现它?
  • 我不知道您可以按原样使用的任何具体解决方案。
  • @mkl,我想在我的 pdf 中添加一个带有“保存”按钮的新页面。是否可以使该按钮执行我想要的操作?保存文档的当前状态。
  • 很遗憾,您仍然不清楚用户应该能够进行哪些更改。如果您只是指填写表单,那么您可以通过创建一个将表单内容发送到目标 URL 的保存按钮来实现您的用例。但请注意,该解决方案需要功能齐全的 PDF 查看器。很多查看器只支持只读查看,只有部分支持填表,甚至不是所有的都支持发送表单值到目标URL .

标签: .net pdf model-view-controller itext itext7


【解决方案1】:

OP 在 cmets 中阐明了他保存从网页对文件所做的修改的含义:

我说的是表格填写。您能否分享一下如何将表单内容发送到目标 URL 的代码示例?

不幸的是,我只能找到 iText 7 for Java 的示例:

public void manipulatePdf(String dest) throws IOException {
    PdfDocument pdfDoc = new PdfDocument(new PdfReader(SUBCRIBE), new PdfWriter(dest));
    PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, true);
    PdfButtonFormField submit1 = PdfFormField.createPushButton(pdfDoc, new Rectangle(90, 660, 50, 30), "POST", "post");
    submit1.setBackgroundColor(new DeviceGray(0.75f));
    submit1.setVisibility(PdfFormField.VISIBLE_BUT_DOES_NOT_PRINT);
    submit1.setAction(PdfAction.createSubmitForm(
            "/book/request", null,
            PdfAction.SUBMIT_HTML_FORMAT | PdfAction.SUBMIT_COORDINATES));
    // add the button
    form.addField(submit1);
    // create a submit button that posts the form as FDF
    PdfButtonFormField submit2 = PdfFormField.createPushButton(
            pdfDoc, new Rectangle(200, 660, 50, 30), "FDF", "FDF");
    submit2.setBackgroundColor(new DeviceGray(0.7f));
    submit2.setVisibility(PdfFormField.VISIBLE_BUT_DOES_NOT_PRINT);
    submit2.setAction(PdfAction.createSubmitForm(
            "/book/request", null, PdfAction.SUBMIT_EXCL_F_KEY));
    // add the button
    form.addField(submit2);
    // create a submit button that posts the form as XFDF
    PdfButtonFormField submit3 = PdfFormField.createPushButton(
            pdfDoc, new Rectangle(310, 660, 50, 30), "XFDF", "XFDF");
    submit3.setBackgroundColor(new DeviceGray(0.7f));
    submit3.setVisibility(PdfFormField.VISIBLE_BUT_DOES_NOT_PRINT);
    submit3.setAction(PdfAction.createSubmitForm(
            "/book/request", null, PdfAction.SUBMIT_XFDF));
    // add the button
    form.addField(submit3);
    // create a reset button
    PdfButtonFormField reset = PdfFormField.createPushButton(
            pdfDoc, new Rectangle(420, 660, 50, 30), "reset", "RESET");
    reset.setBackgroundColor(new DeviceGray(0.7f));
    reset.setVisibility(PdfFormField.VISIBLE_BUT_DOES_NOT_PRINT);
    // TODO DEVSIX-573
    reset.setAction(PdfAction.createResetForm(null, 0));
    form.addField(reset);
    // close the document
    pdfDoc.close();
}

(SubmitForm.java 示例从 iText in Action 第 2 版第 9 章移植到 iText 7)

如您所见,有多个选项取决于发送到 URL 的确切内容。

【讨论】:

  • 我之前看过这段代码。但我无法使用它。我无法了解如何将表单字段值发送到发布操作的主要原因。
  • 正如我之前所说,我的最终目标是使用文档中表单中的值更新数据库。
  • 但我无法使用它。 - 为什么不呢?因为它是用 Java 编写的?
  • 我的最终目标是更新数据库 - 您主要使用与 PDF 相关的标签而不是与数据库相关的标签来标记您的问题。此外,您没有提供与数据库访问相关的信息。因此,所有看起来你的问题都是“将 PDF 表单数据发布到服务器”部分,而不是“如何编写 SQL 更新语句”。
  • 因为不清楚如何将文件发送到我的行动。对不起,我以为我做到了,显然我忘了添加。让我编辑问题以获取更多信息。
【解决方案2】:

您似乎正在显示一个 PDF 对象并希望将其中的数据发回?恐怕这行不通。浏览器如何将 PDF 的表单转换为 POST 数据?但是,如果这将在现代浏览器上运行,那么也许可以将 JavaScript 查看器视为 Mozilla PDF.js?我可以想象你可以通过一种或另一种方式破解它们以从 PDF 表单中获取数据并通过 Ajax 将其发回。

【讨论】:

    猜你喜欢
    • 2012-12-31
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多