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));
现在 Adobe 根据需要显示注释:
我使用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));
现在 Adobe 根据需要显示注释: