C# 无法在pdf中打印复选框
我们正在使用WkHtmlToPdf将html转换为pdf。现在,我已经使所有的表单字段可编辑的要求,以及。由于在将Html转换为Pdf时WkHtmlToPdf中存在错误,因此会使表单字段的所有属性都可见而不可打印 为了解决这个问题,我们使用ITextSharp读取WkHtmlToPdf生成的现有pdf,并将该属性设置为对每个表单字段可见 我就是这样做的C# 无法在pdf中打印复选框,c#,itextsharp,wkhtmltopdf,C#,Itextsharp,Wkhtmltopdf,我们正在使用WkHtmlToPdf将html转换为pdf。现在,我已经使所有的表单字段可编辑的要求,以及。由于在将Html转换为Pdf时WkHtmlToPdf中存在错误,因此会使表单字段的所有属性都可见而不可打印 为了解决这个问题,我们使用ITextSharp读取WkHtmlToPdf生成的现有pdf,并将该属性设置为对每个表单字段可见 我就是这样做的 var pdfReader = new PdfReader(inputFilename); using (va
var pdfReader = new PdfReader(inputFilename);
using (var outputStream = new FileStream(outputFilename, FileMode.OpenOrCreate))
{
var stamper = new PdfStamper(pdfReader, outputStream);
// Regenarating all the fileds using itextSharp.
// Since wkHtmltoPdf has differnt default settings for pdf form fields (Visible and not Printable)
var formFields = stamper.AcroFields;
var filedNames = formFields.Fields.Keys;
foreach (var keyName in filedNames)
{
formFields.SetFieldProperty(keyName, "setflags", PdfAnnotation.FLAGS_PRINT, null);
formFields.SetFieldProperty(keyName, "setflags", PdfFormField.FF_EDIT, null);
formFields.SetFieldProperty(keyName, "textsize", 8.0f, null);
formFields.RegenerateField(keyName);
}
}
这解决了除复选框之外的所有字段的问题。我在html中有几个复选框,它们使用WkHtmlToPdf转换为pdf。我意识到,当我尝试重新生成field()(foreach循环中的最后一行)复选框时,它会失去所有属性(无论我是否选中),它只显示空复选框,并且不可编辑
为了解决这个问题,我提出了以下建议
if (formFields.GetFieldType(keyName).Equals(AcroFields.FIELD_TYPE_CHECKBOX))
{
// Regenerate checkbox formfield causing it to reset all its properties
// including checkd/uncheked property
formFields.SetFieldProperty(keyName, "setflags", PdfAnnotation.FLAGS_PRINT, null);
// Ignore the commented code as it is not working Not sure why??? and how
//var item = formFields.GetFieldItem(keyName);
//var appearance = item.GetValue(0).Get(PdfName.AS);
//if (appearance != null)
/{
// if (appearance.tostring().tolower().equals("/yes"))
// {
// formfields.regeneratefield(keyname);
// Not even one working when I try to set the check box status like below
// success = formfields.setfield(keyname, "yes");
// success = formfields.setfield(keyname, "/yes");
// success = formfields.setfield(keyname, "/yes");
// success = formfields.setfield(keyname, "on");
// success = formfields.setfield(keyname, "1");
// }
}
使用“代码”(不包括已注释的代码)复选框成功保留其状态并显示在生成的Pdf中。但它不是印刷品。我选中了“属性”复选框,它与pdf中的任何其他字段一样可见。除复选框外,所有字段(文本框)都在打印其值
我正在通过-->打开pdf文档-->表单-->添加/编辑字段检查属性
我做错了什么?我没有在复选框上设置属性,而是尝试使用Itextsharp构建一个全新的复选框,但无法使用ItexSharp手动示例。以前有人做过这种事吗
即使我使用ItextSharp生成了一个新的复选框,我怎样才能完全替换现有的复选框
非常感谢您阅读我的故事。我通过用ITextSharp替换wkHtmltoPdf复选框解决了这个问题。我正在详细地回答,这可能会节省你的时间
/// <summary>
/// By default, wkHtmlToPdf leaves pdf form fields as being "Visible but not printable". Using iTextSharp we will change them to being "Visible".
/// </summary>
private string MakePdfFormFieldsEditable(string inputFilename)
{
var outputFilename = CreateTempPdfFilename();
var pdfReader = new PdfReader(inputFilename);
var checkedCheckBoxNames = new List<string>();
using (var outputStream = new FileStream(outputFilename, FileMode.OpenOrCreate))
{
var stamper = new PdfStamper(pdfReader, outputStream);
// Regenarating all the fileds using itextSharp.
// Since wkHtmltoPdf has differnt default settings for pdf form fields (Visible and not Printable)
var formFields = stamper.AcroFields;
var filedNames = formFields.Fields.Keys;
var removableFiledNames = new List<string>();
foreach (var keyName in filedNames)
{
if (formFields.GetFieldType(keyName).Equals(AcroFields.FIELD_TYPE_CHECKBOX))
{
// Since check boxes generated by WKHtmltoPdf is crapy and click behaviour is annoying
// we are replacing it with new checkbox
var item = formFields.GetFieldItem(keyName);
// Return "/yes" if it's checked
var appearance = item.GetValue(0).Get(PdfName.AS);
// Holds current page number information and Location on the page (Rectangle Dimentions)
var position = formFields.GetFieldPositions(keyName);
var newCheckBoxFieldname = CreateNewCheckBox(position, stamper, keyName);
// set newly created check box value
if (appearance != null && appearance.ToString().ToLower().Equals("/yes"))
{
checkedCheckBoxNames.Add(newCheckBoxFieldname);
}
// List of Check Box field names to be removed
removableFiledNames.Add(keyName);
}
else
{
formFields.SetFieldProperty(keyName, "setflags", PdfAnnotation.FLAGS_PRINT, null);
formFields.SetFieldProperty(keyName, "setflags", PdfFormField.FF_EDIT, null);
formFields.SetFieldProperty(keyName, "textsize", 8.0f, null);
formFields.RegenerateField(keyName);
}
}
// Removing check boxes generaed with WkHtmlToPdf
foreach (var oldCheckBox in removableFiledNames)
{
formFields.RemoveField(oldCheckBox);
}
stamper.Close();
}
return checkedCheckBoxNames.Any() ? UpdateCheckBoxes(outputFilename, checkedCheckBoxNames) : outputFilename;
}
/// <summary>
/// Updating Check Boxe's status checked or not in input file
/// </summary>
private string UpdateCheckBoxes(string inputFilename, ICollection<string> checkedCheckBoxNames)
{
var outputFilename = CreateTempPdfFilename();
var pdfReader = new PdfReader(inputFilename);
using (var outputStream = new FileStream(outputFilename, FileMode.OpenOrCreate))
{
var stamper = new PdfStamper(pdfReader, outputStream);
var newformFields = stamper.AcroFields;
var newfiledNames = newformFields.Fields.Keys;
foreach (var keyName in newfiledNames)
{
if (!newformFields.GetFieldType(keyName).Equals(AcroFields.FIELD_TYPE_CHECKBOX)) continue;
if (!checkedCheckBoxNames.Contains(keyName)) continue;
newformFields.SetField(keyName, "On");
}
stamper.Close();
}
return outputFilename;
}
/// <summary>
/// Constructing new check box
/// </summary>
/// <param name="fieldPosition"></param>
/// <param name="stamper"></param>
/// <param name="keyName"></param>
/// <returns>new field name</returns>
private string CreateNewCheckBox(IList<AcroFields.FieldPosition> fieldPosition, PdfStamper stamper, string keyName)
{
var pageNumber = fieldPosition.First().page;
var locationRectangle = fieldPosition.First().position;
PdfContentByte canvas = stamper.GetOverContent(1);
// Create array with two appearances
var onOff = new PdfAppearance[2];
onOff[0] = canvas.CreateAppearance(15, 15);
onOff[0].Rectangle(1, 1, 13, 13);
onOff[0].Stroke();
onOff[1] = canvas.CreateAppearance(15, 15);
onOff[1].SetRGBColorFill(255, 128, 128);
onOff[1].Rectangle(1, 1, 13, 13);
onOff[1].FillStroke();
onOff[1].MoveTo(1, 1);
onOff[1].LineTo(14, 14);
onOff[1].MoveTo(1, 14);
onOff[1].LineTo(14, 1);
onOff[1].Stroke();
var newFieldName = keyName + "_G";
// Creates new check boxes
var checkbox = new RadioCheckField(stamper.Writer, locationRectangle, newFieldName, "On");
var field = checkbox.CheckField;
// Add check box field to writer
stamper.AddAnnotation(field, pageNumber);
return newFieldName;
}
//
///默认情况下,wkHtmlToPdf将pdf表单字段保留为“可见但不可打印”。使用iTextSharp,我们将它们更改为“可见”。
///
私有字符串MakePdfFormFieldsEditable(字符串输入文件名)
{
var outputFilename=CreateTempDffileName();
var pdfReader=新的pdfReader(inputFilename);
var checkedCheckBoxNames=新列表();
使用(var outputStream=newfilestream(outputFilename,FileMode.OpenOrCreate))
{
var stamper=新的PdfStamper(pdfReader,outputStream);
//使用itextSharp重新生成所有文件。
//因为wkHtmltoPdf对pdf表单字段有不同的默认设置(可见和不可打印)
var formFields=stamper.AcroFields;
var filedNames=formFields.Fields.Keys;
var removableFiledNames=新列表();
foreach(filedNames中的var keyName)
{
if(formFields.GetFieldType(keyName).Equals(AcroFields.FIELD\u TYPE\u复选框))
{
//因为WKHtmltoPdf生成的复选框很糟糕,点击行为很烦人
//我们正在用新的复选框替换它
var item=formFields.GetFieldItem(keyName);
//如果选中,则返回“/是”
var外观=item.GetValue(0.Get)(PdfName.AS);
//保存当前页码信息和页面上的位置(矩形尺寸)
var position=formFields.GetFieldPositions(键名);
var newCheckBoxFieldname=CreateNewCheckBox(位置、压模、键名);
//设置新创建的复选框值
if(外观!=null&&appearance.ToString().ToLower().Equals(“/yes”))
{
添加(newCheckBoxFieldname);
}
//要删除的复选框字段名列表
removableFiledNames.Add(keyName);
}
其他的
{
formFields.SetFieldProperty(键名,“setflags”,PdfAnnotation.FLAGS_PRINT,null);
formFields.SetFieldProperty(键名,“setflags”,PdfFormField.FF_EDIT,null);
SetFieldProperty(键名,“textsize”,8.0f,null);
formFields.RegenerateField(键名);
}
}
//删除使用WkHtmlToPdf生成的复选框
foreach(removableFiledNames中的var oldCheckBox)
{
formFields.RemoveField(旧复选框);
}
压模关闭();
}
返回checkedCheckBoxNames.Any()?UpdateCheckBox(outputFilename,checkedCheckBoxNames):outputFilename;
}
///
///正在更新输入文件中复选框的状态“已选中”或“未选中”
///
私有字符串UpdateCheckBox(字符串输入文件名、ICollection checkedCheckBoxNames)
{
var outputFilename=CreateTempDffileName();
var pdfReader=新的pdfReader(inputFilename);
使用(var outputStream=newfilestream(outputFilename,FileMode.OpenOrCreate))
{
var stamper=新的PdfStamper(pdfReader,outputStream);
var newformFields=stamper.AcroFields;
var newfiledNames=newformFields.Fields.Keys;
foreach(newfiledNames中的var keyName)
{
如果(!newformFields.GetFieldType(keyName).Equals(AcroFields.FIELD\u TYPE\u复选框))继续;
如果(!checkedCheckBoxNames.Contains(keyName))继续;
设置字段(键名,“On”);
}
压模关闭();
}
返回outputFilename;
}
///
///构造新复选框
///
///
///
///
///新字段名
私有字符串CreateNewCheckBox(IList fieldPosition、PdfStamper母版、字符串键名)
{
var pageNumber=fieldPosition.First().page;
var locationRectangle=fieldPosition.First().position;
<style>
label.checkbox:before {
content: "☐ ";
}
label.checkbox.checked:before {
content: "☑ ";
}
</style>
<label class="checkbox checked">Yes</label>
<label class="checkbox">No</label>