如何使用 itextsharp 将 UTF-8 字符写入 pdf 文件?

Posted

技术标签:

【中文标题】如何使用 itextsharp 将 UTF-8 字符写入 pdf 文件?【英文标题】:How to write UTF-8 characters to a pdf file using itextsharp? 【发布时间】:2011-08-31 21:43:14 【问题描述】:

我在谷歌上尝试了很多,但找不到..

感谢任何帮助。

请在下面找到代码:-

protected void Page_Load(object sender, EventArgs e)
    
        StreamReader read = new StreamReader(@"D:\queryUnicode.txt", Encoding.Unicode);
        string str = read.ReadToEnd();

        Paragraph para = new Paragraph(str);

        FileStream file = new FileStream(@"D:\Query.pdf",FileMode.Create);

        Document pdfDoc = new Document();
        PdfWriter writer = PdfWriter.GetInstance(pdfDoc, file );

        pdfDoc.Open();
        pdfDoc.Add(para);
        pdfDoc.Close();

        Response.Write("Pdf file generated");
    

【问题讨论】:

您遇到了什么问题?如果缺少字符,请查看此处:***.com/questions/1322303/… 是的,pdf中缺少字符,但是我已经看过并尝试了这个链接,当我下载itextsharp的源代码时,它没有FactorySettings.cs文件。而且,他正在使用“arial.ttf”,我想要UTF-8字符。 实际上,我从中获取字符串的记事本保存为 ANSI 编码,当我将其更改为“UTF-8”编码时,现在这些字符在 pdf 中显示为 æ 【参考方案1】:

您正在将 html 转换为 PDF 吗?如果是这样,你应该注意这一点,否则没关系。我问的唯一原因是您关于获得æ 的最后评论让我这么认为。如果你是,看看这篇文章: iTextSharp 5 polish character

此外,有时当人们说“Unicode”时,他们真正想做的是将 Wingdings 之类的符号放入 PDF 中。如果您的意思是查看这篇文章,并知道 Unicode 和 Wingding 符号真的完全不相关。 Unicode symbols in iTextSharp

这是一个完整的工作示例,它使用两种方式编写 Unicode 字符,一种使用字符本身,另一种使用 C# 转义序列。确保以支持宽字符的格式保存文件。此示例使用 iTextSharp 5.0.5。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;

namespace ConsoleApplication1

    class Program
    
        static void Main(string[] args)
        
            //Create our document object
            Document Doc = new Document(PageSize.LETTER);

            //Create our file stream
            using (FileStream fs = new FileStream(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.pdf"), FileMode.Create, FileAccess.Write, FileShare.Read))
            
                //Bind PDF writer to document and stream
                PdfWriter writer = PdfWriter.GetInstance(Doc, fs);

                //Open document for writing
                Doc.Open();

                //Add a page
                Doc.NewPage();

                //Full path to the Unicode Arial file
                string ARIALUNI_TFF = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "ARIALUNI.TTF");

                //Create a base font object making sure to specify IDENTITY-H
                BaseFont bf = BaseFont.CreateFont(ARIALUNI_TFF, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

                //Create a specific font object
                Font f = new Font(bf, 12, Font.NORMAL);

                //Write some text, the last character is 0x0278 - LATIN SMALL LETTER PHI
                Doc.Add(new Phrase("This is a test ɸ", f));

                //Write some more text, the last character is 0x0682 - ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE
                Doc.Add(new Phrase("Hello\u0682", f));

                //Close the PDF
                Doc.Close();
            
        
    

使用 iTextSharp 时,您必须确保使用的字体支持您要使用的 Unicode 代码点。使用字体时还需要指定IDENTITY-H。我不完全知道这意味着什么,但这里有一些讨论:iTextSharp international text

【讨论】:

@Chris,你写的字符,即 ɸ 和 \u0682 是正确的,但我文件中的字符仍然是代码形式。例如字符æ 将作为æ 出现,ø 将作为ø 出现。这些在 GridView 的网页上很好,我在响应内容类型中使用了 UTF-8。 @Chris,如果我使用代码编写这些字符,即new Phrase("æ ø å", font),那么它们就可以了。但我从保存为 UTF8 编码的文本文件中获取文本,使用 StreamReader 将其转换为字符串,然后将此字符串传递给Phrase constructor @Puneet Dudeja,您说的是网格视图和文本文件,您正在使用哪个?这是您需要在问题中进一步解释的两件事。对于文本文件,你确定它是 UTF-8 编码的(你用十六进制编辑器检查过)吗?你是如何获取文本文件的?文件系统还是网络?对于gridview,你是如何获取的?请使用一些代码编辑您的帖子,以便我们更好地帮助您。 @Chris,我已将整个代码包含在我的问题中。此代码还包括示例代码的最后两行,这些字符在 pdf 中很好。但是我的文本文件中的其他字符(瑞典字符)以#encoded 的形式出现。请帮忙。 谢谢,BaseFont.IDENTITY_H 为我工作。酷豆!

以上是关于如何使用 itextsharp 将 UTF-8 字符写入 pdf 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 itextsharp.net 将相同的数字签名放置到 PDF 中的多个位置

在 iTextSharp 5.4.5.0 中复制字段

如何使用 itextsharp 从 PDF 的列表框中检索用户选择的索引?

使用 iTextSharp 在 C# 中旋转 PDF

Java中字节流如何转字符流,OutputStreamWriter用法

使用itextsharp将单独签名的哈希放置到PDF中的多个位置