对于此特定情况,如何在生成的PDF中显示已选中的复选框?

时间:2017-04-09 05:17:32

标签: c# pdf itext

我正在使用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();
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

在Stack Overflow之前,您的问题已经多次得到解答:

使用图像的好处是,您确实希望按照您想要的方式对复选框进行整形。使用字体时,您必须对字体提供的任何字形感到满意。这可能是一个空的复选框(如TickboxCharacter)示例中的情况;或者没有方框的复选标记,如How to display ✔ in PDF using iTextSharp?

中所述

您可能还想阅读iText : Unable to print mathematical characters like ∈, ∩, ∑, ∫, ∆ √, ∠,因为复选框(已选中或未选中)只不过是一个特殊字符,例如∈,∩,Σ,∫,Δ√,∠,......