2016-08-05 38 views
0

aufgerufen Ich versuche, PDF zu erstellen, die chinesische Zeichen enthält. Es funktioniert wie erwartet, wenn ich generatePdf() `von der Hauptmethode aufrufen. Der Screenshot wird angezeigt. Jedoch, wenn ich im Weblogic-Server bereitstellen und aus dem Browser "http://localhost:7001/PdfGeneration/itext/genpdf" aufrufen, wendet es die Schriftart nicht an. Ich habe einen Screenshot angehängt.itext pdf Erstellen in Java: Chinesisch funktioniert nicht, wenn ein Service-Anruf von localhost gemacht wird aber funktioniert gut, wenn von der Hauptmethode

Folgende Einstellungen:

  • weblogic Version: 12.2.1
  • Itextpdf, xmlworker: 5.4.5
  • Jersey Version: 2.2
  • IntelliJ IDE 2016.1.3
  • jdk 1.8

style.css enthält nur diese

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

warum negative vote? Kannst du zeigen, was ich falsch gemacht habe? – HKP

+1

das Problem gefunden, 'InputStream ist = neues ByteArrayInputStream ("

篆書 Test

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

Antwort

1

fand ich das Problem, habe ich die Funktion Parse von itext versehen, die INPUTSTREAM- erfordert, wie Sie unten

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

sehen Und ich tat dies zuerst

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

Jetzt habe ich eine INPUTSTREAM- und dann ging ich an die Parse und es funktionierte.

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

Aus irgendeinem Grund die erste Methode in lokalen funktioniert aber nicht, wenn gehostet.