2012-04-26 4 views
8

Tôi đang sử dụng dll itextsharp để chuyển đổi HTML sang PDF.Hiển thị các ký tự Unicode trong việc chuyển đổi Html thành Pdf

HTML có một số ký tự Unicode như α, β ... khi tôi cố chuyển đổi HTML sang PDF, các ký tự Unicode không được hiển thị bằng PDF.

chức năng của tôi:

Document doc = new Document(PageSize.LETTER); 

using (FileStream fs = new FileStream(Path.Combine("Test.pdf"), FileMode.Create, FileAccess.Write, FileShare.Read)) 
{ 
    PdfWriter.GetInstance(doc, fs); 

    doc.Open(); 
    doc.NewPage(); 

    string arialuniTff = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), 
             "ARIALUNI.TTF"); 

    BaseFont bf = BaseFont.CreateFont(arialuniTff, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 

    Font fontNormal = new Font(bf, 12, Font.NORMAL); 

    List<IElement> list = HTMLWorker.ParseToList(new StringReader(stringBuilder.ToString()), 
               new StyleSheet()); 
    Paragraph p = new Paragraph {Font = fontNormal}; 

    foreach (var element in list) 
    { 
     p.Add(element); 
     doc.Add(p); 
    } 

    doc.Close(); 
} 

Trả lời

10

Khi giao dịch với các ký tự Unicode và iTextSharp có một vài điều bạn cần phải chăm sóc. Việc đầu tiên bạn đã làm và đó là nhận được một phông chữ hỗ trợ nhân vật của bạn. Điều thứ hai là bạn muốn thực sự đăng ký phông chữ với iTextSharp để nhận thức được nó.

//Path to our font 
string arialuniTff = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "ARIALUNI.TTF"); 
//Register the font with iTextSharp 
iTextSharp.text.FontFactory.Register(arialuniTff); 

Bây giờ chúng tôi có phông chữ, chúng tôi cần tạo đối tượng StyleSheet cho iTextSharp khi nào và cách sử dụng.

//Create a new stylesheet 
iTextSharp.text.html.simpleparser.StyleSheet ST = new iTextSharp.text.html.simpleparser.StyleSheet(); 
//Set the default body font to our registered font's internal name 
ST.LoadTagStyle(HtmlTags.BODY, HtmlTags.FACE, "Arial Unicode MS"); 

Phần không phải HTML mà bạn cũng cần làm là đặt tham số encoding đặc biệt. Mã hóa này dành riêng cho iTextSharp và trong trường hợp của bạn, bạn muốn nó là Identity-H. Nếu bạn không đặt cài đặt này thì nó sẽ mặc định là Cp1252 (WINANSI).

//Set the default encoding to support Unicode characters 
ST.LoadTagStyle(HtmlTags.BODY, HtmlTags.ENCODING, BaseFont.IDENTITY_H); 

Cuối cùng, chúng tôi cần phải vượt qua stylesheet của chúng tôi để các ParseToList phương pháp:

//Parse our HTML using the stylesheet created above 
List<IElement> list = HTMLWorker.ParseToList(new StringReader(stringBuilder.ToString()), ST); 

Đưa rằng tất cả lại với nhau, từ mở để đóng bạn phải:

doc.Open(); 

//Sample HTML 
StringBuilder stringBuilder = new StringBuilder(); 
stringBuilder.Append(@"<p>This is a test: <strong>α,β</strong></p>"); 

//Path to our font 
string arialuniTff = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "ARIALUNI.TTF"); 
//Register the font with iTextSharp 
iTextSharp.text.FontFactory.Register(arialuniTff); 

//Create a new stylesheet 
iTextSharp.text.html.simpleparser.StyleSheet ST = new iTextSharp.text.html.simpleparser.StyleSheet(); 
//Set the default body font to our registered font's internal name 
ST.LoadTagStyle(HtmlTags.BODY, HtmlTags.FACE, "Arial Unicode MS"); 
//Set the default encoding to support Unicode characters 
ST.LoadTagStyle(HtmlTags.BODY, HtmlTags.ENCODING, BaseFont.IDENTITY_H); 

//Parse our HTML using the stylesheet created above 
List<IElement> list = HTMLWorker.ParseToList(new StringReader(stringBuilder.ToString()), ST); 

//Loop through each element, don't bother wrapping in P tags 
foreach (var element in list) { 
    doc.Add(element); 
} 

doc.Close(); 

EDIT

Trong nhận xét của bạn, bạn hiển thị HTML chỉ định phông chữ ghi đè. iTextSharp không nhện hệ thống cho phông chữ và trình phân tích cú pháp HTML của nó không sử dụng các kỹ thuật dự phòng phông chữ. Mọi phông chữ được chỉ định trong HTML/CSS phải được đăng ký theo cách thủ công.

string lucidaTff = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "l_10646.ttf"); 
iTextSharp.text.FontFactory.Register(lucidaTff); 
+0

Nếu nội dung html giống như

α,β
Chức năng ở trên không hoạt động. –

16

Bạn cũng có thể sử dụng mới XMLWorkerHelper (từ thư viện itextsharp.xmlworker), bạn cần phải ghi đè thi FontFactory mặc định tuy nhiên.

void GeneratePdfFromHtml() 
{ 
    const string outputFilename = @".\Files\report.pdf"; 
    const string inputFilename = @".\Files\report.html"; 

    using (var input = new FileStream(inputFilename, FileMode.Open)) 
    using (var output = new FileStream(outputFilename, FileMode.Create)) 
    { 
    CreatePdf(input, output); 
    } 
} 

void CreatePdf(Stream htmlInput, Stream pdfOutput) 
{ 
    using (var document = new Document(PageSize.A4, 30, 30, 30, 30)) 
    { 
    var writer = PdfWriter.GetInstance(document, pdfOutput); 
    var worker = XMLWorkerHelper.GetInstance(); 

    document.Open(); 
    worker.ParseXHtml(writer, document, htmlInput, null, Encoding.UTF8, new UnicodeFontFactory()); 

    document.Close(); 
    }  
} 

public class UnicodeFontFactory : FontFactoryImp 
{ 
    private static readonly string FontPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), 
     "arialuni.ttf"); 

    private readonly BaseFont _baseFont; 

    public UnicodeFontFactory() 
    { 
     _baseFont = BaseFont.CreateFont(FontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 

    } 

    public override Font GetFont(string fontname, string encoding, bool embedded, float size, int style, BaseColor color, 
     bool cached) 
    { 
     return new Font(_baseFont, size, style, color); 
    } 
} 
+0

Cảm ơn người đàn ông, nhưng kết quả mà tôi nhận được, các chữ cái được tách ra từ nhau. nó cho thấy تست như ت س ت –

+0

Tôi đã thử nhưng vẫn không hiển thị từ Trung Quốc. –

+0

sau khi nâng cấp lên 5.5.5 và sử dụng mặt trước của Microsoft Yasei, nó hoạt động bình thường ngay bây giờ. –

-1

Dưới đây là vài bước để hiển thị các ký tự unicode trong chuyển đổi HTML sang PDF

  1. Tạo một HTMLWorker
  2. Đăng ký một font unicode và gán nó
  3. Tạo một style sheet và đặt mã hóa thành Identity-H
  4. Gán biểu định kiểu cho trình phân tích cú pháp html

Kiểm tra liên kết bên dưới để biết thêm ....

Tiếng Hin-ddi, Thổ Nhĩ Kỳ, và ký tự đặc biệt cũng được hiển thị trong chuyển đổi từ HTML sang PDF bằng phương pháp này. Kiểm tra dưới đây hình ảnh demo.

enter image description here

+0

[Liên kết với các tài nguyên bên ngoài được khuyến khích, nhưng hãy thêm ngữ cảnh xung quanh liên kết để người dùng đồng nghiệp của bạn sẽ biết ý tưởng đó là gì và tại sao nó lại ở đó. Luôn trích dẫn phần có liên quan nhất của một liên kết quan trọng, trong trường hợp trang web mục tiêu không thể truy cập được hoặc vĩnh viễn ngoại tuyến.] (Http://stackoverflow.com/help/how-to-answer) –