🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Q&A

解決済

2回答

4067閲覧

iTextでHTMLをPDF化する際に<HR>タグが入るとエラーとなる

Yuu-.

総合スコア5

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

0グッド

0クリップ

投稿2019/11/08 09:20

編集2019/11/08 13:21

iText5.5.13.1を使用し、HTMLファイルをPDF化しようとしています。
以下のようなテスト用のHTMLを使用し、PDFへ変換処理を実行しましたが、HTMLWorker.parseToListの箇所でjava.lang.NullPointerExceptionがスローされました。
しかし、<HR>タグを除去すると正常にPDFが出力されるため、<HR>タグが原因というところまではわかりましたが、解決策が見つけられない状況です。
様々な資料を検索していましたが、<HR>タグ対応はiText2系のバージョンで対応済であるという記述を見つけており、対応はしていると考えています。
対応策について知識のある方の意見をお聞きしたいです。

HTML

1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 2<html lang="ja"> 3<body> 4<h1>testてすと</h1> 5<hr> 6<h1>testてすと</h1> 7</body> 8</html>

Java

1public class Test { 2 private static final float MARGIN_SIZE = 60; 3 4 public static void main(String[] args) throws Exception { 5 6 BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("test.html"))); 7 StringBuilder sb = new StringBuilder(); 8 9 String line; 10 while ((line = br.readLine()) != null) { 11 sb.append(line); 12 } 13 14 HashMap<String, Object> prov = new HashMap<String, Object>(); 15 prov.put(HTMLWorker.FONT_PROVIDER, new TextFontProvider()); 16 17 OutputStream file = new FileOutputStream(new File("output.pdf")); 18 Document doc = new Document(PageSize.A4, 30, 30, 30, 30); 19 PdfWriter.getInstance(doc, file); 20 doc.open(); 21 22 HTMLWorker wkr = new HTMLWorker(doc); 23 wkr.setProviders(prov); 24 25 List<Element> list = HTMLWorker.parseToList( 26 new StringReader(sb.toString()), 27 null, prov); 28 for (Element e : list) { 29 doc.add(e); 30 } 31 doc.close(); 32 file.close(); 33 } 34 35}

Java

1public class TextFontProvider implements FontProvider { 2 /** フォントサイズ */ 3 private static final float FONT_SIZE = 10.5f; 4 5 /** 6 * コンストラクタ 7 */ 8 public TextFontProvider() { 9 } 10 11 @Override 12 public Font getFont(String fontname, String encoding, boolean embedded, 13 float size, int style, BaseColor color) { 14 Font font = null; 15 try { 16 font = new Font(BaseFont.createFont("KozMinPro-Regular", "UniJIS-UCS2-H", 17 BaseFont.NOT_EMBEDDED), FONT_SIZE, style, color); 18 } catch (Exception e) { 19 e.printStackTrace(); 20 } 21 22 return font; 23 } 24 25 @Override 26 public boolean isRegistered(String fontname) { 27 return false; 28 } 29} 30

・スローされた例外の全文は以下になります。

Exception in thread "main" java.lang.NullPointerException at com.itextpdf.text.html.simpleparser.HTMLWorker.createLineSeparator(HTMLWorker.java:445) at com.itextpdf.text.html.simpleparser.HTMLTagProcessors$5.startElement(HTMLTagProcessors.java:208) at com.itextpdf.text.html.simpleparser.HTMLWorker.startElement(HTMLWorker.java:199) at com.itextpdf.text.xml.simpleparser.SimpleXMLParser.processTag(SimpleXMLParser.java:581) at com.itextpdf.text.xml.simpleparser.SimpleXMLParser.go(SimpleXMLParser.java:299) at com.itextpdf.text.xml.simpleparser.SimpleXMLParser.parse(SimpleXMLParser.java:607) at com.itextpdf.text.html.simpleparser.HTMLWorker.parse(HTMLWorker.java:153) at com.itextpdf.text.html.simpleparser.HTMLWorker.parseToList(HTMLWorker.java:828) at com.itextpdf.text.html.simpleparser.HTMLWorker.parseToList(HTMLWorker.java:809) at test.Test.main(Test.java:44)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2019/11/08 10:59

スローされた例外の全文をご提示願えますか.
m.ts10806

2019/11/08 12:50

HTML5で記述するとどうなりますか?
Yuu-.

2019/11/08 14:08 編集

確認したところHTML5で記述しても同様の例外がスローされました。
m.ts10806

2019/11/08 13:33

XML形式だと閉じタグがいるかもしれません。 <hr /> 上記で試してみてください。
Yuu-.

2019/11/08 14:08 編集

m.ts10806様 hrタグに閉じタグを加えてみたのですが、同様の例外がスローされてしまいました。
guest

回答2

0

皆さまからの回答をいただき、最終的に以下のコードでXMLWorkerを使用し、日本語でのPDF出力まで実現できました。
お力添えいただき、ありがとうございました。

Java

1public class Test2 { 2 3 @SuppressWarnings("deprecation") 4 public static void main(String[] args) throws Exception { 5 6 BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("file/test.html"))); 7 StringBuilder sb = new StringBuilder(); 8 9 String line; 10 while ((line = br.readLine()) != null) { 11 sb.append(line); 12 } 13 14 OutputStream file = new FileOutputStream(new File("file/output2.pdf")); 15 Document doc = new Document(PageSize.A4, 30, 30, 30, 30); 16 PdfWriter writer = PdfWriter.getInstance(doc, file); 17 18 XMLWorkerHelper wkr = XMLWorkerHelper.getInstance(); 19 20 doc.open(); 21 wkr.parseXHtml(writer, doc, 22 new ByteArrayInputStream(sb.toString().getBytes("UTF-8")), 23 Charset.forName("UTF-8"), new TextFontProvider()); 24 25 doc.close(); 26 file.close(); 27 } 28 29}

Java

1public class TextFontProvider extends XMLWorkerFontProvider { 2 /** フォントサイズ */ 3 private static final float FONT_SIZE = 10.5f; 4 5 /** 6 * コンストラクタ 7 */ 8 public TextFontProvider() { 9 } 10 11 public Font getFont(String fontname, String encoding, boolean embedded, 12 float size, int style, BaseColor color) { 13 Font font = null; 14 try { 15 font = new Font(BaseFont.createFont("KozMinPro-Regular", "UniJIS-UCS2-H", 16 BaseFont.NOT_EMBEDDED), FONT_SIZE, style, color); 17 } catch (Exception e) { 18 e.printStackTrace(); 19 } 20 21 return font; 22 } 23 24 public boolean isRegistered(String fontname) { 25 return false; 26 } 27}

投稿2019/11/09 08:05

Yuu-.

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

HTMLWorker も調べましたが, どうもバグのような気がする動作になっていました.
HTMLWorker は非推奨ですし, XMLWorker をご利用になったほうが良いように思います.
フォントの指定方法は調べていないのですが, XMLWorker(Helper) を使用すると <hr/> でエラー無く変換されました.

java

1package teratail.q221953; 2 3import java.io.File; 4import java.io.FileInputStream; 5import java.io.FileOutputStream; 6import java.io.InputStream; 7import java.io.OutputStream; 8 9import com.itextpdf.text.Document; 10import com.itextpdf.text.PageSize; 11import com.itextpdf.text.pdf.PdfWriter; 12import com.itextpdf.tool.xml.XMLWorkerHelper; 13 14public class Test { 15 public static void main(String[] args) throws Exception { 16 InputStream is = new FileInputStream("test.html"); 17 OutputStream file = new FileOutputStream(new File("output.pdf")); 18 Document doc = new Document(PageSize.A4, 30, 30, 30, 30); 19 PdfWriter writer = PdfWriter.getInstance(doc, file); 20 doc.open(); 21 22 XMLWorkerHelper.getInstance().parseXHtml(writer, doc, is); 23 24 doc.close(); 25 file.close(); 26 is.close(); 27 } 28}

投稿2019/11/08 17:06

jimbe

総合スコア13204

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yuu-.

2019/11/09 05:54

調べていただきありがとうございます。XMLWorkerを使う方向で検討してみます。フォントを指定しないと日本語での出力ができないので悩ましいところでありますが...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問