0

以下の目的を達成するためのガイダンスが必要です。

  1. HTMLファイルをPDFに変換できる、Windows Server 2012でスケジュールされたジョブとして実行できるものを開発します。以前は Omniformat を使用していましたが、Windows Server 2012 に移行した後は、Omniformat が使用できなくなりました。

  2. iText を使用していくつかの POC を行いましたが、次の点を除いて有望に見えます。スタイリングで font-family が指定されていない場合、IE はそれを正しくレンダリングしますが、IText は空のブロックを出力するだけです。これは、アラビア語とロシア語の文字を使用したテスト ケースで発生しました。

<html>
  <head></head>
  <body>
    Random Text, which I have no idea what are there.<br/>
   
    <span style="font-family: Arabic Typesetting">This works!
    Arabic : &#1587;&#1593;&#1610;&#1583;
    </span>

    <span> This isn't working
    Arabic : &#1587;&#1593;&#1610;&#1583;
    </span>
    <br/>
    <span>
    Russian: &#1057;&#1095;&#1072;&#1089;&#1090;&#1083;&#1080;&#1074;&#1099;&#1081;
    </span>
    
    <span style="font-family: MingLiu">
    Simplfied Chinese: &#24555;&#20048;
    </span>
   <br/>
    <span style="font-family: MingLiu">
    Traditional Chinese: &#24555;&#27138;
    </span>
  </body>
</html>

私がこれまでにやってきたこと。

  1. カスタマイズされた TagProcessor が必要だと思います。

    public class MyParaGraph extends ParaGraph {

        @Override
        public List<Element> content(WorkerContext arg0, Tag arg1, String arg2) 
        {
              List<Element> elements = super.content(arg0, arg1,arg2);
              Iterator<Element> eleIter = elements.iterator();
              while(  eleIter.hasNext())
              {
                  Element element = eleIter.next();
                  List<Chunk> chunks = element.getChunks();
                  Iterator<Chunk> chunkIter = chunks.Iterator();
    
                  while (chunkIter.hasNext())
                  {
                       Chunk chunk = chunkIter.next();
                       for ( char charStr : arg2.toCharArray() )
                       {
                            //Intention is for future, if there is multiple Unicode characteres of different langauge, to create different chunk with differnt Font assigned.  
                            //For now, quite useless loop,
    
                             //isarabic  
                             if ( (code > 0x600 && code < code < 0x6FF) ||   (code > 0x750 && code < code < 0x77F))    
                             {  
                                  //Pardon me, my dev is not linked to internet, i cant copy and paste so i just define a sub set.
                                  if (chunk.getFont.getBaseFont()==null)
                                  {
                                      //It appear the processor failed to find the font-family style being define, as other tag with font-family define will not be null.
                                        FontFactory.register("C:/Windows/Font/Arabaric Typesetting.ttf");
                                       Font font = FontFactory.getFont("Arabaric TypeSetting");
                                       chunk.setFont(font);  //Its doesnt seems to update it to ask IText ot use Arabaric Typesetting..
                                  }
                             }        
                         }                             
                   }               
              }
        } 
    }
    

HTMLPDFConverter.java メイン:

public static void main(String[] args){
TagProcessorFactory factory = Tags.getHtmlTagProcessorFactory();
factory.addProcessor(new MyParaGraph(), "p","span", "div");

Document doc = new Document();
PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream("D:/sample.pdf"));
writer.setPageSize(PageSize.A4);
document.open();


HtmlPipelineContext htmlContext = new HtmlPipelineContext (null);
htmlContext.setTagFactory(factory);
CssResolver cssResolver = XMLWorkerHelper.getInstance().getDefaultCssResolver(true);
Pipeline<?> pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext, new PdfWriterPipleline(doc. writer)));

XMLWorker worker= new XMLWorker(pipeline, true);
XMLParser p = new XMLParser(worker);
p.parse( new InputStreamReader(new FileInputStream("D:/sample.html"), "UTF-8");
doc.close();
}

アラビア語とロシア語は PDF に表示されません。アドバイスをいただければ幸いです。混乱して申し訳ありません。別のネットワーク上にあるため、開発から POC コードをコピーして貼り付けることができません。ありがとう

4

0 に答える 0