2012-10-10 33 views
8

Tôi đang tạo PDF bằng cách sử dụng plugin xuất của Grails (về cơ bản là Flying Saucer). Trang GSP của tôi là trang UTF-8 (hoặc ít nhất các thuộc tính cho thấy rằng đó là UTF-8, cũng ở đầu trang GSP có chỉ thị <?xml version="1.0" encoding="UTF-8"?>). Lúc đầu, tệp PDF được tạo đúng chứa các ký tự âm sắc "äöüõ", nhưng ký tự Cyrillic bị thiếu trong PDF (không hiển thị). Sau đó, tôi đã thay đổi tệp css của mình như được mô tả trong tài liệu bằng cách thêm như sau:Phông chữ Chiếc đĩa bay cho các ký tự unicode

ArialUni.ttf cũng được triển khai tới máy chủ. Nhưng bây giờ tôi nhận được cả hai ký tự umlaut và ký tự Cyrillic được hiển thị như hộp. Nếu tôi thay đổi giá trị thuộc tính -fs-pdf-encoding thành Identity-H thì các ký tự umlaut được hiển thị đúng, nhưng các ký tự Cyrillic được hiển thị dưới dạng dấu hỏi.

Bất kỳ ý tưởng nào về phông chữ nào có thể được sử dụng để hiển thị đúng cả ký tự âm sắc và ký tự Cyrillic? Hoặc có thể là CSS của tôi bằng cách nào đó sai? Bất kỳ gợi ý nào cũng sẽ được đánh giá cao.

UPD 1: Tôi cũng đã cố gắng css sau (được tạo ra bởi http://fontface.codeandmore.com/):

@font-face { 
    font-family: 'ArialUnicodeMS'; 
    src: url('arialuni.ttf'); 
    src: url('arialuni.eot?#iefix') format('embedded-opentype'), 
     url('arialuni.woff') format('woff'), 
     url('arialuni.ttf') format('truetype'), 
     url('arialuni.svg#arialuni') format('svg'); 
    font-weight: normal; 
    font-style: normal; 
    -fs-pdf-font-embed: embed; 
    -fs-pdf-font-encoding: UTF-8; 
} 

body { 
    font-family:'ArialUnicodeMS'; 
} 

Tôi đã thêm <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> Tôi cũng đã cố gắng để chạy grails với -Dfile.encoding = UTF-8, như đã được đề cập ở đây: http://grails.1312388.n4.nabble.com/PDF-plugin-Having-problems-with-instalation-td2297840.html, nhưng không có gì hữu ích. Ký tự Cyrillic không được hiển thị. Bất kỳ ý tưởng nào khác có thể là vấn đề gì?

* BTW: * Tôi đang đóng gói PDF của tôi như zip và gửi lại cho trình duyệt trong phản ứng như thế:

response.setHeader "Content-disposition", "attachment; filename=test.zip" 
response.setHeader "Content-Encoding", "UTF-8" 
response.contentType = 'application/zip' 
response.outputStream << zip 
response.outputStream.flush() 
response.outputStream.close() 

Tôi có cần phải bằng cách nào đó xem xét mã hóa trong khi nén ????, mà tôi làm như thế:

public static byte[] zipBytes(Map<String, ByteArrayOutputStream> fileNameToByteContentMap) throws IOException { 
     ByteArrayOutputStream zipBaos = new ByteArrayOutputStream(); 
     ZipOutputStream zos = new ZipOutputStream(zipBaos); 
     fileNameToByteContentMap.eachWithIndex {String fileName, ByteArrayOutputStream baos, i -> 
      byte[] content = baos.buf 
      ZipEntry entry = new ZipEntry(fileName) 
      entry.setSize(content.length) 
      zos.putNextEntry(entry) 
      zos.write(content) 
      zos.closeEntry() 
     } 
     zos.close() 
     return zipBaos.toByteArray(); 
    } 
+0

Nếu content-type của bạn định nghĩa là UTF-8 không? –

+0

Bạn có nghĩa là loại nội dung HTML? –

Trả lời

6

Đối với một số lý do nó bắt đầu làm việc với css sau và file .ttf, được tạo ra bởi mặt-kit-máy phát điện:

@font-face { 
    src: url('arialuni.ttf'); 
    -fs-pdf-font-embed: embed; 
    -fs-pdf-font-encoding: Identity-H; 
} 

body { 
    font-family: Arial Unicode MS, Lucida Sans Unicode, Arial, verdana, arial, helvetica, sans-serif; 
    font-size: 8.8pt; 
} 

Điều lạ lùng là nếu tôi đặt phông chữ vào một số thư mục, hãy nói "phông chữ", nó sẽ tìm phông chữ nhưng ký tự sẽ không được hiển thị.

+3

Mã số -fs-pdf-font: Identity-H; là chìa khóa; nó nói với Flying Saucer rằng đây là một phông chữ Unicode và không phải là một phông chữ được giới hạn trong các trang mã nhất định – jaygooby

+0

để đặt phông chữ trong một thư mục mà tôi đã sử dụng 'src: url ('$ {baseUrl} /assets/ARIALUNI.TTF'); 'trong đó baseUrl được truyền trong mô hình với' grailsLinkGenerator.serverBaseURL' – fego

8

Tôi đã quản lý để "bật" ký tự unicode (cyrillic hoặc séc) trong mã java và hơn nữa cung cấp phông chữ kiểu đúng trong tài nguyên của tôi (CALIBRI.TTF).

import org.w3c.dom.Document; 
import org.xhtmlrenderer.pdf.ITextRenderer; 
import com.lowagie.text.pdf.BaseFont; 

... 
    ITextRenderer renderer = new ITextRenderer(); 
    URL fontResourceURL = getClass().getResource("fonts/CALIBRI.TTF"); 
    //System.out.println("font-path:"+fontResourceURL.getPath()); 

    /* HERE comes my solution: */ 
    renderer.getFontResolver().addFont(fontResourceURL.getPath(), 
       BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 

    renderer.setDocument(doc, null); 
    renderer.layout(); 
    baos = new ByteArrayOutputStream(); 
    renderer.createPDF(baos); 
    baos.flush(); 
    result = baos.toByteArray(); 
... 

Cuối cùng tôi đã thêm các font-family 'Calibri' vào phần css của tài liệu của tôi:

... 
<style type="text/css"> 
    span { font-size: 11pt; font-family: Calibri; } 
... 
+1

Tôi gặp sự cố khi sử dụng giải pháp này. Tôi đã sửa nó bằng cách sử dụng 'URL fontResourceURL = getClass(). GetResource ("/fonts/CALIBRI.TTF ");' (lưu ý dấu gạch chéo ban đầu trong đường dẫn tài nguyên phông chữ) và 'fontResolver.addFont (fontResourceURL.toString(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED); '(lưu ý phương thức toString thay vì getPath) –

Các vấn đề liên quan