我使用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();
}
答案 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会根据需要显示注释: