2015-01-05 36 views
3

我已經問過關於這個問題的另一個問題,但我無法使它工作。我改變了我的代碼,所以現在是這樣的:itextpdf HTML to PDF包含西里爾文字母

import java.io.FileOutputStream; 
import java.io.StringReader; 

import com.itextpdf.text.Document; 
import com.itextpdf.text.PageSize; 
import com.itextpdf.text.pdf.PdfWriter; 
import com.itextpdf.tool.xml.XMLWorkerHelper; 
public class HTM { 

    public static void main(String ... args) { 
     try { 
      Document document = new Document(PageSize.LETTER); 
      PdfWriter pdfWriter = PdfWriter.getInstance 
          (document, new FileOutputStream("C:\\testpdf.pdf")); 
      document.open(); 

      XMLWorkerHelper worker = XMLWorkerHelper.getInstance(); 

      String htmlString = "<html><head>" 
        + "<meta http-equiv=\"content-type\" content=\"application/xhtml+xml; charset=UTF-8\" />" 
        + "</head><body>" 
        + "<h1>Zdravo Кристијан!</h1>" 
        + "</body></html>"; 


      worker.parseXHtml(pdfWriter, document, new StringReader(htmlString)); 
      document.close(); 
      System.out.println("Done."); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

我的問題是pdf不顯示西里爾文字符。我知道如何使用不同的字符集和字體來製作簡單的pdf,但是我想將html文件或字符串(在我的情況下,它是一個html字符串)轉換爲pdf。提前致謝。

+2

你確定使用的字體**支持**西里爾字符?閱讀http://stackoverflow.com/questions/26631815/cant-get-czech-characters-while-generating-a-pdf也有類似的問題。 – usr2564301

+0

此外,你應該確保你的整個工具鏈都設置爲UTF-8。 –

+0

是的。問題是我需要將html轉換爲pdf。我成功了段落,但那不是我需要的。你知道如何在我的例子中使用字體嗎? – Chris

回答

0

我嘗試了很多東西,但每次我都錯過了一些東西。感謝@BrunoLowagie和@SubOptimal。這是我的代碼,我使它運行自定義字體。它還包含一個簡單的html作爲字符串,但是在註釋中顯示瞭如何使用實際的html和css文件完成它。

public class HtmlToPdf { 
    public static final String DEST = "/home/christian/Desktop/testDoc.pdf"; 

    public void createPdf(String file) throws IOException, DocumentException { 
     // step 1 
     Document document = new Document(); 

     // step 2 
     PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file)); 
     writer.setInitialLeading(12.5f); 

     // step 3 
     document.open(); 

     // step 4 

     // CSS 
     CSSResolver cssResolver = new StyleAttrCSSResolver(); 
     // CssFile cssFile = XMLWorkerHelper.getCSS(new FileInputStream(CSS)); 
     // cssResolver.addCss(cssFile); 

     // HTML 
     XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS); 
     fontProvider.register("fonts/Arimo-Regular.ttf"); 
     fontProvider.register("fonts/Arimo-Bold.ttf"); 
     fontProvider.register("fonts/Arimo-Italic.ttf"); 
     fontProvider.addFontSubstitute("lowagie", "Arimo"); 
     CssAppliers cssAppliers = new CssAppliersImpl(fontProvider); 
     HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers); 
     htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory()); 

     // Pipelines 
     PdfWriterPipeline pdf = new PdfWriterPipeline(document, writer); 
     HtmlPipeline html = new HtmlPipeline(htmlContext, pdf); 
     CssResolverPipeline css = new CssResolverPipeline(cssResolver, html); 

     // XML Worker 
     XMLWorker worker = new XMLWorker(css, true); 
     XMLParser p = new XMLParser(worker); 

     // p.parse(new FileInputStream(HTML)); 
     String htmlContent = " HERE GOES HTML CODE "; 
     p.parse(new StringReader(htmlContent)); 
     // step 5 
     document.close(); 
    } 

    public static void main(String[] args) throws IOException, DocumentException { 
     new D06_ParseHtmlFonts().createPdf(DEST); 
    } 
} 

我注意到,它有font-family: actual font that supports wished encoding;在CSS/HTML和電子郵件客戶端總是使用內聯CSS是很重要的。

2

基於來自@ bruno-lowagie的評論,只需對您發佈的代碼進行小小更改即可在Windows上使用。有關如何指定特定字體的更多信息,請參閱Bruno提出的示例。

public class HTM { 

    public static void main(String ... args) { 
     try { 
      Document document = new Document(PageSize.LETTER); 

      PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("testpdf.pdf")); 
      document.open(); 

      XMLWorkerHelper worker = XMLWorkerHelper.getInstance(); 

      String htmlString = "<html><head>" 
        + "<meta http-equiv=\"content-type\" content=\"application/xhtml+xml; charset=UTF-8\" />" 
        + "</head><body>" 
        + "<p style=\"font-family:courier new\">" // the font to use 
        + "<h1>Zdravo Кристијан!</h1>" 
        + "</p>" 
        + "<h1>Zdravo Кристијан!</h1>" 
        + "</body></html>"; 

      worker.parseXHtml(pdfWriter, document, new StringReader(htmlString)); 
      document.close(); 
      System.out.println("Done."); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

我試過你的代碼,我很震驚,我離解決方案有多近。謝謝! – Chris