我正在尝试通过将 FDF 中的数据保存到 PDFTemplate 中保存 PDF 文件,在我的 WPF < / strong>申请。
所以,情况是这样的。我有一个 PDFTemplate.pdf ,它作为模板并具有占位符(或字段)。现在我以编程方式生成此 FDF 文件,该文件又包含 PDFTemplate 所需的所有字段名称。此外,此 FDF 还包含 PDFTemaplte 的文件路径,因此在打开时,它知道要使用哪个 PDF 。
现在,当尝试双击 FDF 时,它会打开 Adober Acrobat Reader 并显示 PDFTemplate 并填写数据但我无法使用“文件”菜单保存此文件,因为它表示此文件将在没有数据的情况下保存。
那么,我决定使用 iTextsharp ,阅读 PDFTemaplate 文件,阅读 FDF 文件并从那里获取数据,创建另一个 PDF 文件,并将其与数据一起保存。
以下是我正在使用的代码,但是当我打开新保存的文件时,它说该文件已损坏且无法修复:
using (MemoryStream pdfFlat = new MemoryStream())
using (PdfReader pdfReader = new PdfReader(templateLocation))
using(PdfStamper pdfStamper = new PdfStamper(pdfReader, pdfFlat))
using(FdfReader fdfReader = new FdfReader(fdfFileNameAndPath))
{
AcroFields pdfForm = pdfStamper.AcroFields;
pdfForm.SetFields(fdfReader);
pdfStamper.FormFlattening = true;
pdfStamper.Writer.CloseStream = false;
using (FileStream saveStream =
new FileStream(
outputFileNameAndPath,
FileMode.Create,
FileAccess.Write))
{
pdfFlat.WriteTo(saveStream);
pdfFlat.Flush();
saveStream.Close();
}
fdfReader.Close();
pdfStamper.Close();
pdfReader.Close();
pdfFlat.Close();
}
我不确定我做错了什么。请帮忙。
答案 0 :(得分:1)
我可以通过不使用 MemoryStream 来实现:
File.Copy(formLocation, outputFileNameAndPath, true);
using (FileStream pdfFlat = new FileStream(outputFileNameAndPath,FileMode.Open))
using (PdfReader pdfReader = new PdfReader(formLocation))
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, pdfFlat))
using (FdfReader fdfReader = new FdfReader(fdfFileNameAndPath))
{
AcroFields pdfForm = pdfStamper.AcroFields;
pdfForm.SetFields(fdfReader);
pdfStamper.FormFlattening = true;
pdfStamper.Writer.CloseStream = false;
fdfReader.Close();
pdfStamper.Close();
pdfReader.Close();
pdfFlat.Close();
}
我不确定但是当我使用 MemoryStream 打开文件然后将其保存到另一个 FileStream < / strong>,有些东西不起作用,不确定是什么。
但我试图让它变得更简单并且有效。
答案 1 :(得分:0)
这是使用内存流而不是文件流的类似示例。我相信您只需要将内存流位置设置为0.我还从fdf FileSpec属性中获取pdf模板文件名,如果您有多个可能的模板,这将非常有用。
using (Stream stream = new MemoryStream())
using (FdfReader fdfReader = new FdfReader(fdfFilePath))
using (PdfReader pdfReader = new PdfReader(fdfReader.FileSpec))
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, stream)) {
AcroFields pdfForm = pdfStamper.AcroFields;
pdfForm.SetFields(fdfReader);
pdfStamper.FormFlattening = true;
pdfStamper.Writer.CloseStream = false;
fdfReader.Close();
pdfStamper.Close();
pdfReader.Close();
stream.Position = 0;
//string contentType = "application/pdf";
//SaveStreamToCloudStorage(contentType, stream, cloudStorageFileName);
}