使用iText的HTML到PDF:如何生成复选框

我有一个简单的HTML页面,iText能够从中生成PDF。 没关系,但忽略了复选框。 我该怎么办?

import java.io.FileOutputStream; import java.io.StringReader; import com.itextpdf.text.Document; import com.itextpdf.text.PageSize; import com.itextpdf.text.html.simpleparser.HTMLWorker; import com.itextpdf.text.pdf.PdfWriter; public class HtmlToPDF { public static void main(String ... args ) { try { Document document = new Document(PageSize.LETTER); PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("c://temp//testpdf.pdf")); document.open(); String str = "

Testing

" + "check :
" + "
"; htmlWorker.parse(new StringReader(str)); document.close(); System.out.println("Done."); } catch (Exception e) { e.printStackTrace(); } } }

我让它与YAHP( http://www.allcolor.org/YaHPConverter/ )合作。

 import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; // http://www.allcolor.org/YaHPConverter/ import org.allcolor.yahp.converter.CYaHPConverter; import org.allcolor.yahp.converter.IHtmlToPdfTransformer; public class HtmlToPdf_yahp { public static void main(String ... args ) throws Exception { htmlToPdfFile(); } public static void htmlToPdfFile() throws Exception { CYaHPConverter converter = new CYaHPConverter(); File fout = new File("c:/temp/x.pdf"); FileOutputStream out = new FileOutputStream(fout); Map properties = new HashMap(); List headerFooterList = new ArrayList(); String str = "

Testing

" + "check :
" + "
"; properties.put(IHtmlToPdfTransformer.PDF_RENDERER_CLASS, IHtmlToPdfTransformer.FLYINGSAUCER_PDF_RENDERER); //properties.put(IHtmlToPdfTransformer.FOP_TTF_FONT_PATH, fontPath); converter.convertToPdf(str, IHtmlToPdfTransformer.A4P, headerFooterList, "file://c:/temp/", out, properties); out.flush(); out.close(); } }

从html用iText创建pdf有点麻烦。 我建议使用飞碟库。 它也在后台使用iText。

你在生成HTML吗?

如果是这样,那么您可以使用Unicode’投票箱’字符代替使用HTML复选框,即 。 它只是一个盒子,你不能通过电子方式勾选它或取消它; 但如果PDF用于打印,那么人们当然可以用钢笔或铅笔勾选它。

例如:

  String str = "

Testing

" + "check : ☐
" + "
";

请注意,这仅适用于您在PDF中使用Unicode字体的情况; 我认为iText不会使用Unicode字体,除非你告诉它。

你可能在运气不好。

用于解析html标签的“htmlWorker”似乎不支持“input”标签。

 public static final String tagsSupportedString = "ol ul li a pre font span br p div body table td th tr ibu sub sup em strong s strike h1 h2 h3 h4 h5 h6 img"; 

您可以从此处访问“HtmlWorker”的源代码。 http://www.java2s.com/Open-Source/Java-Document/PDF/pdf-itext/com/lowagie/text/html/simpleparser/HTMLWorker.java.htm
正是从这个来源我想出来了。

  public void startElement(String tag, HashMap h) { if (!tagsSupported.containsKey(tag)) return; //return if tag not supported // ... } 

我知道的唯一选择是破解iText。 新的XMLWorker应该比The Old Way(HTMLWorker)更具可扩展性,但它仍然是非平凡的。

可能会传入一些魔法样式标记,这些标记将显示在PdfPageEventHandler的“通用标记”中……让我们看看…

读取代码时,看起来样式或属性“generictag”将通过setGenericTag()传播到...text.Chunk对象。

所以你需要做的是将你不支持的标签XSLT分成div / p /,其中包含“generictag”属性,该属性是一个字符串,用于编码重新创建原始元素所需的信息。

在PdfPageEventHandler的OnGenericTag函数中,您必须解析该标记并重新创建您正在尝试重新创建的内容。

这真是疯狂到可以工作!