C# 对于这种特定情况,如何使复选框在生成的PDF中显示为选中状态?

C# 对于这种特定情况,如何使复选框在生成的PDF中显示为选中状态?,c#,pdf,itext,C#,Pdf,Itext,我正在使用iTextSharp v5.5.11,我想修改以下代码,以便在生成的PDF中显示复选框(可能不一定需要复选框控件;等效的复选框图标或类似图标也可以)。到目前为止,我已经生成了一个复选框,在生成PDF时没有选中它。正如所暗示的,可能有更好的方法来做到这一点。这是我到目前为止的代码。请帮助: using System; using System.Collections.Generic; using System.IO; using Carnotaurus.UtilityPack.Exten

我正在使用iTextSharp v5.5.11,我想修改以下代码,以便在生成的PDF中显示复选框(可能不一定需要复选框控件;等效的复选框图标或类似图标也可以)。到目前为止,我已经生成了一个复选框,在生成PDF时没有选中它。正如所暗示的,可能有更好的方法来做到这一点。这是我到目前为止的代码。请帮助:

using System;
using System.Collections.Generic;
using System.IO;
using Carnotaurus.UtilityPack.Extensions.PrimitiveExtensions;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace Carno.GhostPubs.WindowsFormsApp
{
    public static class PdfITextSharpExtensions
    {
        public static void CreatePdf(this Document doc, IReadOnlyList<string> lines, int pageSize,
            string outputFullFilePath)
        {
            try
            {
                var writer = PdfWriter.GetInstance(doc,
                    new FileStream(outputFullFilePath, FileMode.Create, FileAccess.Write, FileShare.None));

                doc.Open();

                for (var index = 0; index <= lines.Count - 1; index++)
                {
                    var mod = index % pageSize;

                    if (mod == 0 && index > 0)
                    {
                        doc.NewPage();
                    }

                    var field = lines[index];

                    doc.Add(new Paragraph(field));

                    var cb = writer.DirectContent;

                    var onOff = new PdfAppearance[2];

                    onOff[0] = cb.CreateAppearance(20, 20);
                    onOff[0].Rectangle(1, 1, 18, 18);
                    onOff[0].Stroke();

                    onOff[1] = cb.CreateAppearance(20, 20);
                    onOff[1].SetRGBColorFill(255, 128, 128);
                    onOff[1].Rectangle(1, 1, 18, 18);
                    onOff[1].FillStroke();
                    onOff[1].MoveTo(1, 1);
                    onOff[1].LineTo(19, 19);
                    onOff[1].MoveTo(1, 19);
                    onOff[1].LineTo(19, 1);
                    onOff[1].Stroke();

                    var rect = new Rectangle(180, 806 - index * 40, 200, 788 - index * 40);
                    var checkFieldName = field.RemoveSpaces();
                    var radioCheckField = new RadioCheckField(writer, rect, checkFieldName, "On");
                    var checkField = radioCheckField.CheckField;
                    checkField.SetAppearance(PdfAnnotation.APPEARANCE_NORMAL, "On", onOff[1]);
                    checkField.SetAppearance(PdfAnnotation.APPEARANCE_NORMAL, "Off", onOff[0]);
                    // checkField.ValueAsName = "On";
                    writer.AddAnnotation(checkField);

                    ColumnText.ShowTextAligned(cb, Element.ALIGN_LEFT,
                        new Phrase(field, new Font(Font.FontFamily.HELVETICA, 18)), 210, 790 - index * 40, 0);

                    cb = writer.DirectContent;
                }
            }
            catch (Exception ex)
            {
            }
            finally
            {
                doc.Close();
            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.IO;
使用Carnotaurus.UtilityPack.Extensions.PrimitiveExtensions;
使用iTextSharp.text;
使用iTextSharp.text.pdf;
命名空间Carno.GhostPubs.WindowsFormsApp
{
公共静态类PdfITextSharpExtensions
{
公共静态void CreatePdf(此文档文档,IReadOnlyList行,int pageSize,
字符串outputFullFilePath)
{
尝试
{
var writer=PdfWriter.GetInstance(doc,
新的文件流(outputFullFilePath、FileMode.Create、FileAccess.Write、FileShare.None);
doc.Open();
对于(var指数=0;指数0)
{
doc.NewPage();
}
var字段=行[索引];
添加文件(新段落(字段));
var cb=writer.DirectContent;
var onOff=新的PDF外观[2];
onOff[0]=cb.CreateAppearance(20,20);
onOff[0]。矩形(1,1,18,18);
onOff[0]。笔划();
onOff[1]=cb.CreateAppearance(20,20);
onOff[1]。SetRGBColorFill(255、128、128);
onOff[1]。矩形(1,1,18,18);
onOff[1]。FillStroke();
onOff[1],MoveTo(1,1);
onOff[1].LineTo(19,19);
onOff[1],MoveTo(1,19);
onOff[1].LineTo(19,1);
onOff[1]。笔划();
var rect=新矩形(180806-索引*40200788-索引*40);
var checkFieldName=field.removespace();
var radioCheckField=新的radioCheckField(writer、rect、checkFieldName,“On”);
var checkField=radioCheckField.checkField;
checkField.SetAppearance(pdfanotation.APPEARANCE_NORMAL,“On”,onOff[1]);
checkField.SetAppearance(pdfantation.APPEARANCE_NORMAL,“Off”,onOff[0]);
//checkField.ValueAsName=“On”;
writer.AddAnnotation(checkField);
ColumnText.ShowTextAligned(cb,Element.ALIGN_左,
新短语(字段,新字体(Font.FontFamily.HELVETICA,18)),210790-索引*40,0;
cb=writer.DirectContent;
}
}
捕获(例外情况除外)
{
}
最后
{
doc.Close();
}
}
}
}

从评论中,我们确定您不需要交互式复选框(用户可以通过单击Adobe Reader中的复选框来更改该复选框)。你不需要PDF格式的表格;您只需要一个复选框字符(选中或取消选中)

不幸的是,我看到您使用Helvetica作为字体,并且Helvetica不包含复选框或复选标记字符。你必须找到另一种字体

您的问题在堆栈溢出之前已被回答多次:

  • 建议使用PNG而不是字符
  • 解释如何使用字体添加复选框(我的答案是iText 5答案;接受的答案是iText 7答案;我不明白为什么您仍然使用iText 5或更早版本)
使用图像的优点是,您确实希望按照您想要的方式来塑造复选框。使用字体时,您必须对字体提供的任何字形感到满意。这可能是一个空复选框(如示例中所示);或不带复选框的复选标记,如中所述


您可能还希望读取,因为复选框(选中或未选中)只不过是一个特殊字符,例如∈, ∩, ∑, ∫, ∆ √, ∠,...

我没有投反对票,但这个问题有一些严重的缺陷。根据前面的对话,我假设您不想添加表单字段。您只想添加一个复选框,可以是选中的,也可以是未选中的。这是使用字形完成的,而不是使用
RadioCheckField
。如果我的假设是正确的,人们会感到沮丧,因为他们会告诉你必须勾选表单中的复选框;您也会感到沮丧,因为您不需要表单,只需要选中复选框。简言之:你表达问题的方式让每个人都感到沮丧。我建议你修正你的问题。如果你不相信我不是投反对票的人,我可以很容易地再投一张反对票来说服你。@BrunoLowagie,没错;我只想添加一个复选框,不一定是复选框字段。在这种情况下,请更新您的问题,因为现在,每个答案都将解释如何创建表单,这不是您想要的。这就好像你想吃冰淇淋,但你要的是棒棒糖。当别人给你棒棒糖时,你会感到失望,而给你想要的东西的人不会理解你的失望。