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

ITextSharp add annotation with Chinese content

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

using (var ms = new MemoryStream())
        {

            PdfReader reader = new PdfReader(file);
            PdfStamper stamper = new PdfStamper(reader, ms, '[=10=]', 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();
        }

考虑了很多奇怪的可能性后,结果证明解决方案很简单。

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>"));

特别是使用了只有一个 string 参数的 PdfString 构造函数。此构造函数记录在案(在相应的 iText Javadocs 中;iTextSharp 代码注释缺少重要细节)为:

/**
 * Constructs a <CODE>PdfString</CODE>-object containing a string in the
 * standard encoding <CODE>TEXT_PDFDOCENCODING</CODE>.
 *
 * @param value    the content of the string
 */
public PdfString(String value)

标准编码 TEXT_PDFDOCENCODING (PDFDocEncoding) 可以对所有 ISO Latin 1 字符集进行编码,并记录在 PDF 规范的附件 D ISO 32000-1.

显然 Latin-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_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));

现在 Adob​​e 根据需要显示注释: