itext Создание PDF в Java: китайский не работает при вызове службы из localhost, но работает нормально при вызове из метода main

Я пытаюсь создать PDF, который содержит китайские иероглифы. Он работает, как и ожидалось, когда я вызываю generatePdf()`из основного метода. Снимок экрана показан. Однако при развертывании на сервере weblogic и вызове из браузера " http://localhost:7001/PdfGeneration/itext/genpdf" шрифт не применяется. Я приложил снимок экрана.

Следующие настройки:

  • веблогическая версия: 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";
}

КОД:

@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"));
        }

    }

скриншоты

1 ответ

Решение

Я обнаружил проблему, я использовал функцию синтаксического анализа, предоставленную itext, которая требует Inputstream, как вы можете видеть ниже

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

И изначально я делал это

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"));

По какой-то причине первый метод работает локально, но не при размещении.

Другие вопросы по тегам