C# 未使用iTextSharp显示中文字符

C# 未使用iTextSharp显示中文字符,c#,fonts,itextsharp,C#,Fonts,Itextsharp,我一直在使用itextsharp从数据库数据生成pdf。我的数据库数据包含文本、x和y坐标以及页码。我是这样做的 string oldFile = Server.MapPath(string.Format("~/App_Data/Documents/Templates/{0}", documentModel.Filename)); // open the reader PdfReader reader = new PdfReader(oldFile);

我一直在使用itextsharp从数据库数据生成pdf。我的数据库数据包含文本、x和y坐标以及页码。我是这样做的

 string oldFile = Server.MapPath(string.Format("~/App_Data/Documents/Templates/{0}", documentModel.Filename));

        // open the reader
        PdfReader reader = new PdfReader(oldFile);
        Rectangle size = reader.GetPageSizeWithRotation(1);
        iTextSharp.text.Document document = new iTextSharp.text.Document(size);

        PdfWriter writer = PdfWriter.GetInstance(document, _memoryStream);
        writer.CloseStream = false;
        document.Open();

        PdfContentByte cb;
        PdfImportedPage page;
        BaseFont bf;


foreach (var pageNumber in pages)
        {
            document.NewPage();

            cb = writer.DirectContent;
            // create the new page and add it to the pdf
            page = writer.GetImportedPage(reader, pageNumber);
            cb.AddTemplate(page, 0, 0);
            bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
            cb.SetColorFill(BaseColor.DARK_GRAY);
            cb.SetFontAndSize(bf, 9);

            var items = documentModel.FieldContents.Where(a => a.Page == pageNumber).ToList();

            foreach (var item in items)
            {
                cb.BeginText();
                cb.ShowTextAligned(item.Alignment, item.Text ?? string.Empty, item.X, item.Y, item.Rotation);
                cb.EndText();
            }

        }

        ////////////////////////////////////////////////////////////////////

        document.Close();
        writer.Close();
        reader.Close();

        byte[] byteInfo = _memoryStream.ToArray();
        _memoryStream.Write(byteInfo, 0, byteInfo.Length);
        _memoryStream.Position = 0;

        RedirectToAction("Index");
        return new FileStreamResult(_memoryStream, "application/pdf");

我用这个已经有一段时间了。但我也想支持汉字。我试着输入汉字,但它没有被显示。我把它改回了英文字符,效果很好。有什么想法吗?谢谢

代码中存在不同的错误

正如mkl已经解释的那样,您使用的Type1Helvetica字体没有嵌入,也不知道任何有关中文字形的信息。你需要使用一种会画汉字的字体。此外,你不应该期望它了解任何关于汉语的知识

您还创建了非法代码(并导致无效的PDF语法):

这是一个没有定义字体和大小的文本对象。您正在图形状态(不属于)而不是文本状态(需要)下使用“setFontAndSize()”方法。这段代码运行的事实告诉我您使用的是旧的iTextSharp版本

解决问题的方法是找到有关添加的示例。然后创建一个“短语”,并使用。通过使用
ColumnText
,您可以避免现在使用低级方法时遇到的问题:您使用的是
beginText()
endText()
,而没有阅读PDF规范
ColumnText
将在幕后完成所有这些困难的工作


如果Java示例让您感到困惑,请访问相应示例的C#端口链接。

代码中存在不同的错误

正如mkl已经解释的那样,您使用的Type1Helvetica字体没有嵌入,也不知道任何有关中文字形的信息。你需要使用一种会画汉字的字体。此外,你不应该期望它了解任何关于汉语的知识

您还创建了非法代码(并导致无效的PDF语法):

这是一个没有定义字体和大小的文本对象。您正在图形状态(不属于)而不是文本状态(需要)下使用“setFontAndSize()”方法。这段代码运行的事实告诉我您使用的是旧的iTextSharp版本

解决问题的方法是找到有关添加的示例。然后创建一个“短语”,并使用。通过使用
ColumnText
,您可以避免现在使用低级方法时遇到的问题:您使用的是
beginText()
endText()
,而没有阅读PDF规范
ColumnText
将在幕后完成所有这些困难的工作


如果Java示例让您感到困惑,请访问相应示例的C#端口链接。

代码中存在不同的错误

正如mkl已经解释的那样,您使用的Type1Helvetica字体没有嵌入,也不知道任何有关中文字形的信息。你需要使用一种会画汉字的字体。此外,你不应该期望它了解任何关于汉语的知识

您还创建了非法代码(并导致无效的PDF语法):

这是一个没有定义字体和大小的文本对象。您正在图形状态(不属于)而不是文本状态(需要)下使用“setFontAndSize()”方法。这段代码运行的事实告诉我您使用的是旧的iTextSharp版本

解决问题的方法是找到有关添加的示例。然后创建一个“短语”,并使用。通过使用
ColumnText
,您可以避免现在使用低级方法时遇到的问题:您使用的是
beginText()
endText()
,而没有阅读PDF规范
ColumnText
将在幕后完成所有这些困难的工作


如果Java示例让您感到困惑,请访问相应示例的C#端口链接。

代码中存在不同的错误

正如mkl已经解释的那样,您使用的Type1Helvetica字体没有嵌入,也不知道任何有关中文字形的信息。你需要使用一种会画汉字的字体。此外,你不应该期望它了解任何关于汉语的知识

您还创建了非法代码(并导致无效的PDF语法):

这是一个没有定义字体和大小的文本对象。您正在图形状态(不属于)而不是文本状态(需要)下使用“setFontAndSize()”方法。这段代码运行的事实告诉我您使用的是旧的iTextSharp版本

解决问题的方法是找到有关添加的示例。然后创建一个“短语”,并使用。通过使用
ColumnText
,您可以避免现在使用低级方法时遇到的问题:您使用的是
beginText()
endText()
,而没有阅读PDF规范
ColumnText
将在幕后完成所有这些困难的工作


如果Java示例让您感到困惑,请访问相应示例的C#端口链接。

您可以像这样加载本地中文字体

BaseFont baseFont = BaseFont.CreateFont(
                "C:\\Windows\\Fonts\\simhei.ttf",
                BaseFont.IDENTITY_H,
                BaseFont.EMBEDDED); 
Font font = new Font(baseFont);
然后使用“字体”进一步发送文本

您可以参考以下常用的中文本地字体

            {"yahei", "C:\\WINDOWS\\FONTS\\msyh.ttf"},
            {"fangsong", "C:\\WINDOWS\\FONTS\\simfang.ttf"},
            {"heiti" ,"C:\\Windows\\Fonts\\simhei.ttf"},
            {"kaiti" ,"C:\\Windows\\Fonts\\simkai.ttf"},
            {"lishu" ,"C:\\Windows\\Fonts\\SIMLI.TTF"},
            {"youyuan" ,"C:\\Windows\\Fonts\\SIMYOU.TTF"},
            {"songti" ,"C:\\Windows\\Fonts\\simsun.ttc,0"},
            {"xinsongti" ,"C:\\Windows\\Fonts\\simsun.ttc,1"}

希望它能帮助你

您可以像这样加载本地中文字体

BaseFont baseFont = BaseFont.CreateFont(
                "C:\\Windows\\Fonts\\simhei.ttf",
                BaseFont.IDENTITY_H,
                BaseFont.EMBEDDED); 
Font font = new Font(baseFont);
然后使用“字体”进一步发送文本

您可以参考以下常用的中文本地字体

            {"yahei", "C:\\WINDOWS\\FONTS\\msyh.ttf"},
            {"fangsong", "C:\\WINDOWS\\FONTS\\simfang.ttf"},
            {"heiti" ,"C:\\Windows\\Fonts\\simhei.ttf"},
            {"kaiti" ,"C:\\Windows\\Fonts\\simkai.ttf"},
            {"lishu" ,"C:\\Windows\\Fonts\\SIMLI.TTF"},
            {"youyuan" ,"C:\\Windows\\Fonts\\SIMYOU.TTF"},
            {"songti" ,"C:\\Windows\\Fonts\\simsun.ttc,0"},
            {"xinsongti" ,"C:\\Windows\\Fonts\\simsun.ttc,1"}

希望它能帮助你

您可以像这样加载本地中文字体

BaseFont baseFont = BaseFont.CreateFont(
                "C:\\Windows\\Fonts\\simhei.ttf",
                BaseFont.IDENTITY_H,
                BaseFont.EMBEDDED); 
Font font = new Font(baseFont);
然后使用“字体”进一步发送文本

您可以参考以下常用的中文本地字体

            {"yahei", "C:\\WINDOWS\\FONTS\\msyh.ttf"},
            {"fangsong", "C:\\WINDOWS\\FONTS\\simfang.ttf"},
            {"heiti" ,"C:\\Windows\\Fonts\\simhei.ttf"},
            {"kaiti" ,"C:\\Windows\\Fonts\\simkai.ttf"},
            {"lishu" ,"C:\\Windows\\Fonts\\SIMLI.TTF"},
            {"youyuan" ,"C:\\Windows\\Fonts\\SIMYOU.TTF"},
            {"songti" ,"C:\\Windows\\Fonts\\simsun.ttc,0"},
            {"xinsongti" ,"C:\\Windows\\Fonts\\simsun.ttc,1"}
希望能有帮助