使用文本框中的值通过 iTextSharp 保存 PDF 文件

Posted

技术标签:

【中文标题】使用文本框中的值通过 iTextSharp 保存 PDF 文件【英文标题】:Saving PDF file via iTextSharp by using values from textboxes 【发布时间】:2015-02-02 19:25:44 【问题描述】:

在保存 PDF 文件(使用 iTextSharp)方面需要帮助,方法是使用来自多个文本框的值自动填充文件名。

我可以通过输入文件名来保存文件,但我想要的是在单击保存按钮时自动填充名称。

例如:![CID1CON4INV125][1]CID 代表Customer ID,即1CON 代表Contract ID,即4INV 代表@9876543329@,即@9876 @)

这是我目前所拥有的。

SaveFileDialog dlg = new SaveFileDialog();
dlg.Filter = "PDF Files|*.pdf";
dlg.FilterIndex = 0;

if (dlg.ShowDialog() == DialogResult.OK)

    string fileName = dlg.FileName;
    Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 42f, 35f);
    PdfWriter.GetInstance(pdfDoc, new FileStream(fileName, FileMode.Create));
    pdfDoc.Open();

它应该从文本框中获取值(由 SQL 数据填充)ю

【问题讨论】:

你说的是哪个保存按钮?您的应用程序中的那个还是 Adob​​e Reader 中的那个?什么是文本框?您指的是文本字段(AcroForms)还是文本注释?为什么不能直接使用 SQL 数据而不是从 PDF 中获取相同的数据?更加详细一些。您可能会问一些在 PDF 中不可能的问题(通常,不是因为 iTextSharp),或者您可能会问一些简单的问题,但由于您的问题措辞不当,因此无法判断。 还有什么令人困惑的:起初听起来好像您有一个现有的 PDF 文件,其中包含一些值,但随后您显示的代码涉及 DocumentPdfWriter。那没有意义。你确定不需要PdfReaderPdfStamper 好的,现在我在表单上有一个保存按钮,它带我进入“另存为”对话框,该对话框是空的,我需要输入文件名才能将其保存为 PDF。现在我想要的是文件名而不是我输入的名称,它应该使用文本框值自动填充文件的名称,就像我在上面的前任中提到的那样 如果可行,则必须在 PDF 中使用 javascript 来完成。我将不得不查阅 JavaScript for Acrobat 参考手册。如果我发现了什么,我会把它作为答案发布。 你已经更新了我的答案,但你说的又是很混乱。你说:当用另存为对话框尝试相同的事情时出现问题,文件名不会自动填写在另存为对话框中。不幸的是,很难说出你的意思。 【参考方案1】:

我已检查 JavaScript 以获取 Acrobat 参考。

我找到了以下信息:

1.

每个 PDF 文档都有一个 Doc 对象 (this)。 Doc 方法有一个 saveAs 方法,允许您传递文件名:

this.saveAs(
    cPath: "/c/customer/invoices/myDoc.pdf",
    bPromptToOverwrite: true,
);

但是,此方法的使用受到限制。根据规范:此方法只能在批处理或控制台事件期间执行并且此方法在 Adob​​e Reader 中适用于具有保存使用权限的文档。我怀疑您的文档具有使用权、特权方法等...因此:这不是您的选择。 (如果您不知道什么是使用权限,那么您的文档就没有这些权限。)

我对此进行了测试,当我打开 JavaScript 调试器时,我得到:

NotAllowedError:安全设置阻止访问此属性或方法。 Doc.saveAs:1:Field Save:Mouse Up

这与 JavaScript 参考告诉我的一致。

2.

有一个名为app.execMenuItem()app 方法。您可以使用它来打开另存为菜单,如下所示:

app.execMenuItem("SaveAs");

我没有找到任何允许您传递文档新文件名的方法的参数。

3.

有一个属性documentFileName 包含Doc 引用的文档的基本文件名和扩展名。该属性为只读,不可更改,只能查阅文件名:

console.println('"The file name of this document is '
    + this.documentFileName +'."');

Mohammad Haneef Ahmad 更新:

//string folderPath = "C:\\PDFs\\";
//if (!Directory.Exists(folderPath))
//
//    Directory.CreateDirectory(folderPath);
//

//using (FileStream stream = new FileStream(folderPath + "CON" +             txtContractID.Text + "CID" + txtCustomerID.Text + "INV" + txtInvoiceNo.Text + ".pdf", FileMode.Create))

SaveFileDialog dlg = new SaveFileDialog();
dlg.Filter = "PDF|*.pdf";
dlg.FilterIndex = 0;

string fileName = string.Format("CID0CON1INV2.pdf",   txtCustomerID.Text, txtContractID.Text, txtInvoiceNo.Text);

if (dlg.ShowDialog() == DialogResult.OK)

    fileName = dlg.FileName;
    File.WriteAllText(Name, "test");
    
        Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 10f, 10f);
        //PdfWriter.GetInstance(pdfDoc, stream);
        pdfDoc.Open();

注释的代码实际上完成了工作并将文件保存在目录中,但是当尝试使用另存为对话框时会出现问题,文件名不会自动填写在另存为对话框中

Bruno Lowagie 的补充回答:

你正在改变问题。当您说:我想要一个触发“另存为”并根据字段值提出文件名的按钮时,听起来好像您想在 PDF 文件中提供这样的按钮。强>

但是:您显示的代码是关于一个按钮在 PDF 文件之外!

Mohammad Haneef Ahmad 更新:

我的问题可能是我没有正确提出我的问题...既然问题已被理解,那么是否有解决方案。

布鲁诺更新:

你说现在问题已经被理解了。那不是真的。我仍然不知道你在问什么。请参阅我的评论:不幸的是,很难说出你的意思。你在说谜语。

Mohammad Haneef Ahmad 更新:

我很难找到解决此问题的方法,我正在尝试在 Windows 窗体应用程序中使用 iText Sharp 保存 PDF 文件,但是每次我尝试保存文件时,我都必须手动输入文件名,我想要什么要做的是,当“另存为”对话框出现时,文件名应通过连接来自 3 个不同文本框的值作为文件名自动填充。

例如。文件名:CID1CON4INV125(CID代表Customer ID是1,CON代表Contract ID是4,INV代表Invoice ID是125并且是唯一的)

如果我每次都必须选择一个文件名,上面的例子可能很难记住,有没有一种方法可以通过从 txtCustomerID.Text 和 txtContractID.Text 和 txtInvoiceID.Text 获取文件名来自动化这个过程并准备要保存为 PDF 的文件名。

布鲁诺的回答:

你的问题全错了:它与 PDF无关。这完全是关于在 C# 中创建一个 SaveAs 对话框并使用默认文件名填充它。您应该创建一个新问题并删除所有对 PDF 和 iTextSharp 的引用!

实际上,这样的问题可能会作为重复关闭:

Default Filename SaveFileDialog Saving file using SaveFileDialog in C# http://www.codeproject.com/Questions/432557/How-to-set-default-name-for-savefiledialog-in-Csha ...

【讨论】:

以上是关于使用文本框中的值通过 iTextSharp 保存 PDF 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 iTextSharp 将文本添加到内存流中的现有多页 PDF 文档

使用layer.open 父页面获取子页面输入文本框中的值

自动更新文本框

选择下拉框中的值时启用文本框[关闭]

JAVA 在GUI中的文本框输入数据 保存到vector 对象中,在程序退出(按右上角的红叉)通过对象流把

winform中文本框的值怎么保存