C# ITextSharp添加带有中文内容的注释

C# ITextSharp添加带有中文内容的注释,c#,pdf,itextsharp,C#,Pdf,Itextsharp,我使用iTextSharp将带有中文内容的注释添加到PDF中,但它无法在PDF中显示内容。当我输入英文内容时,它可以正确显示。是否可以将字体嵌入到该注释中?我使用的是ITextSharp 5.5.8,这是示例PDF using (var ms = new MemoryStream()) { PdfReader reader = new PdfReader(file); PdfStamper stamper = new PdfSta

我使用iTextSharp将带有中文内容的注释添加到PDF中,但它无法在PDF中显示内容。当我输入英文内容时,它可以正确显示。是否可以将字体嵌入到该注释中?我使用的是ITextSharp 5.5.8,这是示例PDF

using (var ms = new MemoryStream())
        {

            PdfReader reader = new PdfReader(file);
            PdfStamper stamper = new PdfStamper(reader, ms, '\0', true);

            Rectangle annotRect = new Rectangle(60, 750, 120, 670);

            PdfContentByte canvas = new iTextSharp.text.pdf.PdfContentByte(stamper.Writer);
            canvas.SetColorFill(BaseColor.RED);
            canvas.SetColorStroke(BaseColor.RED);

            BaseFont bf = BaseFont.CreateFont("c:\\windows\\fonts\\mingliu.ttc,0", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

            PdfAnnotation annotation = PdfAnnotation.CreateFreeText(stamper.Writer, annotRect, "測試", canvas);

            PdfDate pdfdate = new PdfDate();

            annotation.Flags = PdfAnnotation.FLAGS_READONLY | PdfAnnotation.FLAGS_LOCKED | PdfAnnotation.FLAGS_PRINT;

            annotation.Put(PdfName.CREATIONDATE, pdfdate);
            annotation.Put(PdfName.M, pdfdate);
            annotation.Put(PdfName.NM, new PdfString(Guid.NewGuid().ToString()));
            annotation.Put(PdfName.RC, new PdfString("<?xml version=\"1.0\"?><body xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:xfa=\"http://www.xfa.org/schema/xfa-data/1.0/\" xfa:APIVersion=\"Acrobat:11.0.13\" xfa:spec=\"2.0.2\" style=\"font-size:12.0pt;text-align:left;color:#FF0000;font-weight:normal;font-style:normal;font-family:'MingLiU';font-stretch:normal\"><p dir=\"ltr\"><span style=\"font-family:MingLiU\">測試</span></p></body>"));

            stamper.AddAnnotation(annotation, 1);

            stamper.Close();
            reader.Close();
            return ms.ToArray();
        }
使用(var ms=new MemoryStream())
{
PdfReader reader=新PdfReader(文件);
PdfStamper压模=新的PdfStamper(读卡器,ms,'\0',true);
矩形注释=新矩形(60750120670);
PdfContentByte canvas=new iTextSharp.text.pdf.PdfContentByte(stamper.Writer);
canvas.SetColorFill(BaseColor.RED);
canvas.SetColorStroke(BaseColor.RED);
BaseFont bf=BaseFont.CreateFont(“c:\\windows\\fonts\\mingliu.ttc,0”,BaseFont.IDENTITY,BaseFont.EMBEDDED);
PdfAnnotation annotation=PdfAnnotation.CreateFreeText(stamper.Writer,annotRect,“測試", 帆布);
PdfDate PdfDate=新的PdfDate();
annotation.Flags=pdfantotation.Flags|u只读| pdfantotation.Flags|u锁定| pdfantotation.Flags|u打印;
注释.Put(PdfName.CREATIONDATE,pdfdate);
注释.Put(PdfName.M,pdfdate);
annotation.Put(PdfName.NM,新的PdfString(Guid.NewGuid().ToString());
annotation.Put(PdfName.RC,新的PdfString(“

測試

”); 母版添加注释(注释1); 压模关闭(); reader.Close(); 返回ToArray女士(); }
在考虑了许多奇怪的可能性之后,解决方案变得很简单

OP按如下方式设置richt文本内容:

annotation.Put(PdfName.RC, new PdfString("<?xml version=\"1.0\"?><body xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:xfa=\"http://www.xfa.org/schema/xfa-data/1.0/\" xfa:APIVersion=\"Acrobat:11.0.13\" xfa:spec=\"2.0.2\" style=\"font-size:12.0pt;text-align:left;color:#FF0000;font-weight:normal;font-style:normal;font-family:'MingLiU';font-stretch:normal\"><p dir=\"ltr\"><span style=\"font-family:MingLiU\">測試</span></p></body>"));
标准编码
TEXT\u PDFDOCENCODING
(PDFDOCENCODING)可以对所有ISO拉丁1字符集进行编码,并记录在PDF规范的附录D中

显然,拉丁语-1不足以编码中文字符。因此,需要选择PDF字符串的替代编码UTF-16BE(可以编码所有Unicode字符)。为此,必须使用不同的构造函数:

/**
 * Constructs a <CODE>PdfString</CODE>-object containing a string in the
 * specified encoding.
 *
 * @param value    the content of the string
 * @param encoding an encoding
 */
public PdfString(String value, String encoding)
使用编码常量
TEXT\u UNICODE

annotation.Put(PdfName.RC, new PdfString("<?xml version=\"1.0\"?><body xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:xfa=\"http://www.xfa.org/schema/xfa-data/1.0/\" xfa:APIVersion=\"Acrobat:11.0.13\" xfa:spec=\"2.0.2\" style=\"font-size:12.0pt;text-align:left;color:#FF0000;font-weight:normal;font-style:normal;font-family:'MingLiU';font-stretch:normal\"><p dir=\"ltr\"><span style=\"font-family:MingLiU\">測試</span></p></body>", PdfObject.TEXT_UNICODE));
annotation.Put(PdfName.RC,新的PdfString(“

測試

“,PdfObject.TEXT_UNICODE));
现在,Adobe会根据需要显示注释:

annotation.Put(PdfName.RC, new PdfString("<?xml version=\"1.0\"?><body xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:xfa=\"http://www.xfa.org/schema/xfa-data/1.0/\" xfa:APIVersion=\"Acrobat:11.0.13\" xfa:spec=\"2.0.2\" style=\"font-size:12.0pt;text-align:left;color:#FF0000;font-weight:normal;font-style:normal;font-family:'MingLiU';font-stretch:normal\"><p dir=\"ltr\"><span style=\"font-family:MingLiU\">測試</span></p></body>", PdfObject.TEXT_UNICODE));