【问题标题】:HTML to PDF using iText : How can produce a checkbox使用 iText 将 HTML 转换为 PDF:如何生成复选框
【发布时间】:2011-09-02 06:41:11
【问题描述】:

我有一个简单的 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 = "<HTML><HEAD></HEAD><BODY><H1>Testing</H1><FORM>" + 
                   "check : <INPUT TYPE='checkbox' CHECKED/><br/>" +
                   "</FORM></BODY></HTML>";

      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 = "<HTML><HEAD></HEAD><BODY><H1>Testing</H1><FORM>" +
                         "check : <INPUT TYPE='checkbox' checked=checked/><br/>"   +
                         "</FORM></BODY></HTML>"; 

            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();
    }
}

【问题讨论】:

    标签: java pdf-generation itext


    【解决方案1】:

    您正在生成 HTML 吗?

    如果是这样,那么您可以使用 Unicode“投票箱”字符(&amp;#x2610;)代替 HTML 复选框。它只是一个方框,你不能用电子方式勾选或取消勾选;但如果 PDF 用于打印,那么人们当然可以用钢笔或铅笔在上面打勾。

    例如:

         String str = "<HTML><HEAD></HEAD><BODY><H1>Testing</H1><FORM>" + 
                   "check : &#x2610;<br/>" +
                   "</FORM></BODY></HTML>";
    

    请注意,这仅在您在 PDF 中使用 Unicode 字体时才有效;我认为 iText 不会使用 Unicode 字体,除非你告诉它。

    【讨论】:

    • 单选按钮有类似的吗?
    【解决方案2】:

    你可能在这里不走运。

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

    public static final String tagsSupportedString = "ol ul li a pre font span br p div body table td th tr i b u 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
     // ...
    }
    

    【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 飞碟支持&lt;input&gt;?
    • 我不太清楚。但它支持大多数 html 功能。过去,我在 api 中使用它仅用于 html 和 pdf 报告。顺便说一句,如果您只想在 pdf 中显示一个输入元素(我的意思是如果它不是可填写的表单),您可以使用 div 并通过 css 设置它的样式。
    • 我让它与使用 FlyingSaucer/Itext 的 YAHP 一起工作,我已经用解决方案更新了我的问题。
    • 是的,我试过 YAHP....这真的很酷。我不喜欢像 FS 这样的著名库没有能力支持 html 中的简单标签。
    【解决方案4】:

    我当时知道的唯一选择是破解 iText。新的 XMLWorker 应该比旧方式 (HTMLWorker) 具有更大的可扩展性,但它仍然很重要。

    可能有一些你可以传入的魔法风格标签将显示在 PdfPageEventHandler 的“通用标签”中......让我们看看这里......

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

    因此,您需要做的是使用“generictag”属性将您不受支持的标签 XSLT 到 div/p/whatever 中,该属性是一个字符串,用于对重新创建原始元素所需的信息进行编码。

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




    这简直太疯狂了!

    【讨论】:

    • 我没试过,请注意。 “通用标签”的事情可能会失败,此时你又回到自己破解 iText(或者可能是飞碟,或者等待 XMLWorker 变得更好)。
    • 关于飞碟的一个有趣的事情是 FORM 元素的代码被注释了!我将看看新的 iText XMLWorker。
    • 一定会让你失望 XMLWorker 不包含从元素到 PDF 的映射,但是,添加能够理解表单元素的 TagProcessor 的实现并不难。
    猜你喜欢
    • 2013-07-23
    • 2020-09-04
    相关资源
    最近更新 更多