使用文本框中的值通过 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
,即1
,CON
代表Contract ID
,即4
,INV
代表@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 数据填充)ю
【问题讨论】:
你说的是哪个保存按钮?您的应用程序中的那个还是 Adobe Reader 中的那个?什么是文本框?您指的是文本字段(AcroForms)还是文本注释?为什么不能直接使用 SQL 数据而不是从 PDF 中获取相同的数据?更加详细一些。您可能会问一些在 PDF 中不可能的问题(通常,不是因为 iTextSharp),或者您可能会问一些简单的问题,但由于您的问题措辞不当,因此无法判断。 还有什么令人困惑的:起初听起来好像您有一个现有的 PDF 文件,其中包含一些值,但随后您显示的代码涉及Document
和 PdfWriter
。那没有意义。你确定不需要PdfReader
和PdfStamper
?
好的,现在我在表单上有一个保存按钮,它带我进入“另存为”对话框,该对话框是空的,我需要输入文件名才能将其保存为 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,
);
但是,此方法的使用受到限制。根据规范:此方法只能在批处理或控制台事件期间执行并且此方法在 Adobe 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 文档