我一直在使用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");
我已经使用了一段时间了。但我也想支持中文字符。我尝试输入中文字符,但没有显示。我把它改回英文字符并且有效。有任何想法吗?谢谢!
答案 0 :(得分:2)
您的代码中存在不同的错误。
正如mkl已经解释过的那样,您使用的Type 1 Helvetica字体未嵌入,并且对中文字形一无所知。您需要使用知道如何绘制中文字符的字体。此外CP1252 is the encoding for the Latin alphabet,所以你不应该指望它对中文有任何了解。
您还创建了非法的代码(导致PDF语法无效):
cb.BeginText();
cb.ShowTextAligned(...);
cb.EndText();
这是一个没有定义字体和大小的文本对象。您正在图形状态(不属于它)中使用'setFontAndSize()'方法,而不是文本状态(需要它)。这段代码运行的事实告诉我你正在使用一个旧的iTextSharp版本。 You should upgrade.
您的问题的解决方案是找到有关添加Chinese text with iText的示例。然后创建一个'Phrase'并使用ColumnText.showTextAligned();
定位它。通过使用ColumnText
,您可以避免使用低级方法遇到的问题:您在不阅读PDF规范的情况下使用beginText()
和endText()
。 ColumnText
将在幕后完成所有这些艰难的工作。
如果Java示例让您感到困惑,请访问this page,在那里您可以找到相应示例的C#端口的链接。
答案 1 :(得分:1)
您可以加载本地中文字体
BaseFont baseFont = BaseFont.CreateFont(
"C:\\Windows\\Fonts\\simhei.ttf",
BaseFont.IDENTITY_H,
BaseFont.EMBEDDED);
Font font = new Font(baseFont);
然后使用“font”进一步发短信。
您可以参考下面常用的中文本地字体
{"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"}
希望它可以帮到你!