// 完毕:
using System;
using System.IO;
using System.Drawing;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Pdf.Security;
using GrapeCity.Documents.Pdf.AcroForms;
using GrapeCity.Documents.Pdf.Spec;
using DsPdfWeb.Demos.Common;
namespace DsPdfWeb.Demos
{
// This example shows how to load a password protected PDF Form without specifying the password,
// and change the value of a text field and a comb-text field in the form.
// The modified PDF is saved and re-opened with the password so that we can show it in the demo.
public class NoPassSetFormFields
{
public int CreatePDF(Stream stream)
{
using var fsSrc = File.OpenRead(Path.Combine("Resources", "PDFs", "FormFields-password-user.pdf"));
// Set up DecryptionOptions to allow loading password protected PDFs without password:
var dopt = new DecryptionOptions() { ThrowExceptionIfInvalidPassword = false };
var docSrc = new GcPdfDocument();
docSrc.Load(fsSrc, dopt);
// Change the value of CheckBoxField
//
// Note 1:
// We cannot access the fields by names, like:
// doc.AcroForm.Fields["cbf1"];
// because strings in a password protected PDF are encrypted
// and cannot be accessed without specifying the password.
// The only way is to access fields by indices.
var cbf = (CheckBoxField)docSrc.AcroForm.Fields[0];
cbf.Checked = true;
// Change the value of RadioButtonField:
var rbf = (RadioButtonField)docSrc.AcroForm.Fields[1];
var values = rbf.GetCheckedAppearanceStreamNames();
rbf.Value = values[0];
// Change the value of the TextField, set it to the current date/time:
var tf = (TextField)docSrc.AcroForm.Fields[2];
// Note 2:
// The value of a TextField is specified as a string, but it is not possible
// to work with strings in a password protected PDF without specifying the password.
// In such cases it is possible to use a workaround to set it using PdfName,
// while it is not compliant with the PDF specification,
// at least Adobe Acrobat supports this scenario:
tf.PdfValue = new PdfName(Common.Util.TimeNow().ToString());
// Change the value of a CombTextField to a random string:
var ctf = (CombTextField)docSrc.AcroForm.Fields[3];
var val = Util.LoremIpsum(1, 1, 1, 2, 3);
val = val.Substring(0, Math.Min(val.Length, 10));
ctf.PdfValue = new PdfName(val);
// Note 3: appearance streams cannot be generated in a password protected PDF
// that was loaded without specifying the password, so we set
// the NeedAppearances entry of the AcroForm, which instructs Acrobat to generate
// the missing appearance streams:
docSrc.AcroForm.Set(PdfName.Std.NeedAppearances, PdfBool.True);
// Demo site specific:
// We save the modified password protected document to a temp file,
// and load it again with the password, so that the demo site can show it
// without asking the user for a password (the block is to delete the temp file):
var fn = Path.GetTempFileName();
{
docSrc.Save(fn);
var doc = new GcPdfDocument();
using var fs = File.OpenRead(fn);
doc.Load(fs, "user");
doc.Save(stream);
}
File.Delete(fn);
return docSrc.Pages.Count;
}
}
}