如何在ASP.NET上使用iText保存对pdf文件所做的更改?

时间:2017-06-04 07:46:39

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

我正在创建一个自动化PDF工作的Web应用程序。

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

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

修改

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

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

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

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

我提出的第三种方法是添加一个新页面,其中包含' Save'把它按到我填好的表格上。我想在pdf中使用该按钮来保存我的修改。之后,我将提取已保存表单的值并更新数据库。我尝试使用此代码为我的' Save'添加了一些功能。按钮,但无法理解如何保存更改和/或将更新的文件发送到我的操作控制器:button.SetAction(PdfAction.CreateSubmitForm("/PdfTemplates/SavePdf/" + pdfMetadata.id, null,PdfAction.SUBMIT_EXCL_F_KEY));

如果有人能帮助制作第二种和第三种方法,我将不胜感激。或者也许提供其他方法。

2 个答案:

答案 0 :(得分:0)

OP在评论中澄清了保存对网页文件的修改的含义:

  

我在谈论表格填写。您能否分享一下如何将表单内容发送到目标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

如您所见,根据确切地发送到网址的内容,有多个选项。

答案 1 :(得分:0)

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