2017-12-20 9 views
4

私はアンドロイドアプリケーションのHTMLドキュメントをHTMLドキュメントに変換するためにiTextPdf(Android用iTextG)ライブラリを使用しています。領収書のロゴを除いてすべてがうまくいきます。私のHTMLはAndroid ItextGイメージタグはレンダリングされません

<img src="http...."></img> 

は、PDFはイメージを持っていません作成したイメージのソースのHTTP URLで<img>タグが含まれています。私のJavaアプリケーションで実行されている同じコードとhtmlは、作成されたPDFでロゴを表示しています(画像へのアクセスに問題はないことを示しています)。私はこの機能がJavaとのみ互換性があり、Androidと互換性がないのだろうかと思っていますか? 私は次の依存関係を使用して使用しています:

compile 'com.itextpdf:itextg:5.5.10' 
compile 'com.itextpdf.tool:xmlworker:5.5.10' 

HTMLコード:主な活動で

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="English"> 
<head> 
    <title>Title</title> 
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/> 
</head> 

<body> 
<img src="https://image.flaticon.com/teams/slug/google.jpg"></img> 
<h1>Fischerstube</h1> 
</body> 
</html> 

機能:

private void htmlToPdf(String html) throws DocumentException, IOException { 

    try { 

     File file = new File(Environment.getExternalStorageDirectory() + File.separator + "logo.pdf"); 
     OutputStream fileOutputStream = new FileOutputStream(file); 
     Document document = new Document(); 
     document.setPageSize(new Rectangle(201,720)); 
     PdfWriter writer = PdfWriter.getInstance(document, fileOutputStream); 
     document.open(); 
     InputStream is = new ByteArrayInputStream(html.getBytes()); 
     XMLWorkerHelper.getInstance().parseXHtml(writer, document, is); 
     document.close(); 
     fileOutputStream.close(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

そのだけ<h1>タグをレンダリングし、FischerstubeしかしANDROIRDには画像を表示デバイス。 これに関して私を助けてくれる人は、感謝します。

+1

iTextGとXMLWorkerのバージョンが同じである必要があります。 –

+0

@AmedeeVanGasse:xmlworkerとitextgの両方で5.5.10とチェックして、同じ動作(画像なし)を取得しました。 この組み合わせはJavaではうまく動作していますが、Androidでは問題ありません。 –

+0

@AmedeeVanGasse私がAndroidで使用している情報を更新したことを確認してください。 –

答えて

0

付属のドキュメントをご覧ください。hereは私のために解決されました。

マニフェストにインターネット権限があることを確認してください。

class Base64ImageProvider extends AbstractImageProvider { 

    @Override 
    public Image retrieve(String src) { 
     int pos = src.indexOf("base64,"); 
     try { 
      if (src.startsWith("data") && pos > 0) { 
       byte[] img = Base64.decode(src.substring(pos + 7)); 
       return Image.getInstance(img); 
      } 
      else { 
       return Image.getInstance(src); 
      } 
     } catch (BadElementException ex) { 
      return null; 
     } catch (IOException ex) { 
      return null; 
     } 
    } 

    @Override 
    public String getImageRootPath() { 
     return null; 
    } 
} 

Base64ImageProviderクラスを作成し、あなたがバックグラウンドスレッドでcreatePdfメソッドを実行していることを確認してPDFに

public void createPdf() throws IOException, DocumentException { 
    String str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + 
      "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n" + 
      "<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"English\">\n" + 
      "<head>\n" + 
      " <title>Title</title>\n" + 
      " <meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\"/>\n" + 
      "</head>\n" + 
      "\n" + 
      "<body>\n" + 
      "<img src=\"https://image.flaticon.com/teams/slug/google.jpg\"></img>\n" + 
      "<h1>Fischerstube</h1>\n" + 
      "</body>\n" + 
      "</html>"; 


    // step 1 
    File file = new File(Environment.getExternalStorageDirectory() + File.separator + "logo.pdf"); 
    OutputStream fileOutputStream = new FileOutputStream(file); 
    Document document = new Document(); 
    // step 2 
    PdfWriter writer = PdfWriter.getInstance(document, fileOutputStream); 
    // step 3 
    document.open(); 
    // step 4 

    // CSS 
    CSSResolver cssResolver = 
      XMLWorkerHelper.getInstance().getDefaultCssResolver(true); 

    // HTML 
    HtmlPipelineContext htmlContext = new HtmlPipelineContext(null); 
    htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory()); 
    htmlContext.setImageProvider(new Base64ImageProvider()); 

    // 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 ByteArrayInputStream(str.getBytes())); 

    // step 5 
    document.close(); 
} 

をyoutはHTMLを変換するPDFのメソッドを作成して呼び出します。ネットワーク操作を実行するためです。

関連する問題