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

时间:2015-12-14 09:57:38

标签: c# pdf itextsharp

我使用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, '\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();
        }

1 个答案:

答案 0 :(得分:0)

在考虑了许多奇怪的可能性后,解决方案变得简单。

OP设置了富文本文本内容,如下所示:

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

特别是使用只有一个PdfString参数的string构造函数。这个构造函数记录在(相应的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规范ISO 32000-1的附件D 中。

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

现在,Adobe会根据需要显示注释:

screenshot