无法以pdf格式打印复选框

我们正在使用WkHtmlToPdf从html转换为pdf。 现在我也可以根据要求编辑所有表单字段。 由于WkHtmlToPdf在将Html转换为Pdf时存在错误,因此将所有表单字段的属性设置为Visible Not Printable。

为了解决这个问题,我们使用ITextSharp来读取由WkHtmlToPdf生成的现有pdf,并为每个表单字段将该属性设置为Visible。

这就是我这样做的方式

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。 我意识到,当我尝试RegenerateField()(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复选框解决了这个问题。 我正在详细回答它可能会节省你的时间

  ///  /// By default, wkHtmlToPdf leaves pdf form fields as being "Visible but not printable". Using iTextSharp we will change them to being "Visible". ///  private string MakePdfFormFieldsEditable(string inputFilename) { var outputFilename = CreateTempPdfFilename(); var pdfReader = new PdfReader(inputFilename); var checkedCheckBoxNames = new List(); 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(); 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; } ///  /// Updating Check Boxe's status checked or not in input file ///  private string UpdateCheckBoxes(string inputFilename, ICollection 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; } ///  /// Constructing new check box ///  ///  ///  ///  /// new field name private string CreateNewCheckBox(IList 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; } 

这是我使用CSS伪元素的解决方案: