2016-08-05 3 views
0

중국어 문자가 포함 된 pdf를 만들려고합니다. main 메소드에서 generatePdf()를 호출하면 예상대로 작동합니다. 스크린 샷이 표시됩니다. 그러나 weblogic 서버에 배포하고 브라우저 "http://localhost:7001/PdfGeneration/itext/genpdf"에서 전화를 걸면 글꼴이 적용되지 않습니다. 나는 스크린 샷을 첨부했다.itext pdf 작성 : localhost에서 서비스 호출이있을 때 중국어가 작동하지 않지만 기본 방법에서 호출 할 때 제대로 작동합니다.

다음 설정을

  • 웹 로직 버전 : 12.2.1
  • Itextpdf, xmlworker : 5.4.5
  • 저지 버전 : 2.2
  • 인 IntelliJ IDE 2016년 1월 3일
  • JDK 1.8

style.css에 포함 된 내용은

입니다.
body { 
    font-family: "arial unicode ms"; 
} 

CODE :

@Path("itext") 
    @Api(value = "itext service") 
    public class iTextService { 

//creating an object in main and calling the method works fine 
//this part is commented when calling form server (localhost) 
     public iTextService() throws Exception { 
      generatePdf();   
     } 

     public static void main(String args[]) throws Exception { 
      iTextService obj = new iTextService(); 
      return; 
     } 


    @GET 
     @Path("genpdf") 
     @Produces("application/pdf") 
     public void generatePdf() throws Exception {   

      ByteArrayOutputStream out = new ByteArrayOutputStream();   
      Document doc = new Document(PageSize.A4, 40, 40, 20, 10);   
      PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream("testPDF.pdf")); 

      doc.open(); 
      parseHTML(writer, doc); 
      doc.close();    

     } 
    //this method gives the artifact path 
    // screen shot of the artifact is shown 
    public String getFilePath() { 
      URL url = getClass().getClassLoader().getResource("/resource/"); 
      String path = url.getPath(); 
      try { 
       path = URLDecoder.decode(path, "utf-8"); 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } 
      path = new File(path).getPath(); 
      return path; 
    } 

    public void parseHTML(PdfWriter writer, Document document) throws Exception { 

      //comment this when calling from main method 
      String pathToRes = getFilePath();   

      //case 1 : calling from main method 
      //byte[] encoded = Files.readAllBytes("style.css")); 
      //case 2: calling from browser (localhost) 
      byte[] encoded = Files.readAllBytes(Paths.get(pathToRes + "\\style.css")); 
      String style = new String(encoded); 

      CSSResolver cssResolver = new StyleAttrCSSResolver(); 
      CssFile cssFile = XMLWorkerHelper.getCSS(new ByteArrayInputStream(style.getBytes())); 
      cssResolver.addCss(cssFile); 

      // HTML 
      XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);  
      //case 1 
      //fontProvider.register("ARIALUNI.ttf"); 
      //case 2 
      fontProvider.register(pathToRes + "\\ARIALUNI.ttf"); 


      //FontFactory.register(pathToFont + "\\ARIALUNI.ttf"); 
      //FontFactory.setFontImp(fontProvider); //tried with these two along with exisitng code once 

      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 parser = new XMLParser(worker);   
      parser.parse(new ByteArrayInputStream("<body><p>篆書 test</p></body>".getBytes()), Charset.forName("UTF-8")); 
     } 

    } 

screenshots

+0

왜 부정 투표입니까? 내가 뭘 잘못했는지 지적 해 줄 수 있니? – HKP

+1

이 문제를 발견했습니다. 'InputStream is = new ByteArrayInputStream ("

篆ript test

".getBytes ("UTF-8")); parser.parse (is, Charset.forName ("UTF-8"));'; – HKP

답변

1

난 당신이

public void parse(InputStream in, Charset charSet) throws IOException { this.charset = charSet; InputStreamReader reader = new InputStreamReader(in, charSet); this.parse((Reader)reader); }

아래에서 볼 수 있듯이 나는의 InputStream을 필요로하여 itext에 의해 제공되는 구문 분석 기능을 사용하여 문제를 발견 그리고 처음에 저는이 일을했습니다

XMLParser parser = new XMLParser(worker); parser.parse(new ByteArrayInputStream(buildTemplate().getBytes("UTF-8")), Charset.forName("UTF-8"));

는 지금은 InputStream를 생성 한 후 나는 구문 분석에 통과하고 일했다. 첫 번째 방법은 지역 있지만 호스팅하지 않을 때 작동 어떤 이유

InputStream is = new ByteArrayInputStream(buildTemplate().getBytes("UTF-8")); parser.parse(is, Charset.forName("UTF-8"));

.