【发布时间】:2011-04-18 13:24:43
【问题描述】:
我正在尝试从 HTML 文档生成 PDF 文件。
HTML 文件格式正确且没有错误。我使用 HtmlCleaner 来清理代码,所以它适用于使用 iText 创建 PDF 文件。
这是我在 HTML 示例中使用的代码。
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.html.simpleparser.HTMLWorker;
import com.itextpdf.text.pdf.PdfWriter;
public class pdfIng {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
com.itextpdf.text.Document document = new com.itextpdf.text.Document(PageSize.A4);
PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("D://testpdf.pdf"));
document.open();
document.addAuthor("Author of the Doc");
document.addCreator("Creator of the Doc");
document.addSubject("Subject of the Doc");
document.addCreationDate();
document.addTitle("This is the title");
//SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
//SAXmyHtmlHandler shh = new SAXmyHtmlHandler(document);
HTMLWorker htmlWorker = new HTMLWorker(document);
String str = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"+ " <html> <head /> <body> " +
"<h2>Text</h2> " +
" Here, you will learn how to retrieve all rows from a " +
"database table. You know that table contains the data in " +
"rows and columns format. If you want to access the data from" +
" a table then you need to use some APIs and methods. See brief " +
"descriptions for retrieving all rows from a database table as below: " +
" Description of program: Program establishes the connection " +
"between MySQL database and java file so that the we can retrieve " +
"all data from a specific database table. If any exception occurs " +
"then shows a message SQL code does not execute. " +
"<br /> <br /> <hr /> <br /> " +
"<b>Name</b> " +
"AAAAAA AAAAAAAAA <br /> <b>Date :" +
"</b> 17/04/2011 00:31:18 <br /> <b>Text:" +
"</b> <br /> gggggggggggggg <br /> <br /> " +
" <br /> " +
"<br /> <b>Name</b> " +
" BBBBBB BBBBBBBBB <br /> <b>Date " +
":</b> 17/04/2011 00:35:37 <br /> <b>Text:</b>" +
" <br /> gftgfgfgfgfgggfgf gggggg" +
" <br /> <br /> " +
" <br /> <br /> <b>Name</b> " +
"DDDDDD DDDDDDDDD <br /> <b>Date :</b> " +
" 16/04/2011 22:28:28 <br /> <b>Text:</b> " +
"<br /> w tawa! <br /> <br /> " +
" <br /> <br /> <b>Name</b> " +
"CCCCCC CCCCCCCCC <br /> <b>Date :</b> " +
"16/04/2011 22:37:08 <br /> <b>Text:</b> " +
"<br /> ched tawa!!! <br /> <br /> " +
" <br /> " +
" <br /> <b>Name</b> " +
"BBBBBB BBBBBBBBB <br /> <b>Date :</b> " +
" 16/04/2011 22:37:26 <br /> <b>Text:</b> " +
"<br /> okiiiiii! <br /> <br /> " +
" " +
" <br /> <br /> <b>Name</b> " +
" AAAAAA AAAAAAAAA <br /> <b>Date :</b> " +
" 17/04/2011 02:41:14 <br /> <b>Text:</b> " +
" <br /> cava hakka?? " +
" <br /> <br /> " +
" <br /> </body></html> ";
System.out.println(str);
htmlWorker.parse(new StringReader(str));
document.close();
} catch(DocumentException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
和输出
Exception in thread "main" java.lang.NullPointerException
at com.itextpdf.text.html.simpleparser.HTMLWorker.createLineSeparator(HTMLWorker.java:435)
at com.itextpdf.text.html.simpleparser.HTMLTagProcessors$5.startElement(HTMLTagProcessors.java:208)
at com.itextpdf.text.html.simpleparser.HTMLWorker.startElement(HTMLWorker.java:189)
at com.itextpdf.text.xml.simpleparser.SimpleXMLParser.processTag(SimpleXMLParser.java:566)
at com.itextpdf.text.xml.simpleparser.SimpleXMLParser.go(SimpleXMLParser.java:340)
at com.itextpdf.text.xml.simpleparser.SimpleXMLParser.parse(SimpleXMLParser.java:592)
at com.itextpdf.text.html.simpleparser.HTMLWorker.parse(HTMLWorker.java:143)
at pdfIng.main(pdfIng.java:78)
一开始我以为"<?xml version=\"1.0\" encoding=\"utf-8\"?>"这行会导致错误,但事实并非如此。
我在 str 字符串中搜索是否有导致错误的字符,但所有单词在我看来都是正常和健康的,我无法消除任何一个。
提前感谢您的帮助! :)
【问题讨论】:
-
我认为您的
htmlWorker对象为 null 并在此行引发错误:htmlWorker.parse(new StringReader(str));。 -
我尝试了一个小例子
str = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"+ " <html> <head /> <body> " + "<h2>Text</h2> " + " </body></html> ";,它可以正常工作! :) -
@alibenmessaoud 你找到解决办法了吗?我有这样的错误,我无法控制/编辑要转换的 html 文件。我们可以忽略这样的错误并打印到 html 中显示的 pdf 吗?
-
@HemantMetalia :在我的例子中,
标签在 XML 解析器中不再起作用。看看你是否在你的 HTML 上使用了不受支持的标签 :) -
@alibenmessaoud 我已经使用 jsoup 来解析带有 xml 的文档,它解决了这个问题。 document.outputSettings().syntax( org.jsoup.nodes.Document.OutputSettings.Syntax.xml );