java 使用 iText 将 HTML 转换为 PDF:如何生成复选框

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/6133581/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 14:29:31  来源:igfitidea点击:

HTML to PDF using iText : How can produce a checkbox

javapdf-generationitext

提问by RealHowTo

I have a simple HTML page, iText is able to produce a PDF from it. It's fine but the checkbox is ignored. What can I do about it ?

我有一个简单的 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();
    }
  }
}


I got it working with YAHP ( http://www.allcolor.org/YaHPConverter/).

我让它与 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();
    }
}

采纳答案by saban

creating pdfs with iText from html is a bit troubled. i advise to use the flying saucer library for this. it is also using iText in the background.

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

回答by gutch

Are you generating the HTML?

你在生成 HTML 吗?

If so, then instead of using an HTML checkbox you could using the Unicode 'ballot box' character, which is ?or &#x2610;. It's just a box, you can't electronically tick it or untick it; but if the PDF is intended for printing then of course people can tick it using a pen or pencil.

如果是这样,那么您可以使用 Unicode“投票箱”字符,即?或,而不是使用 HTML 复选框&#x2610;。它只是一个盒子,您无法通过电子方式勾选或取消勾选它;但是如果 PDF 是用于打印的,那么人们当然可以用钢笔或铅笔在它上面打勾。

For example:

例如:

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

Note that this will only work if you're using a Unicode font in your PDF; I think that iText won't use a Unicode font unless you tell it to.

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

回答by kensen john

You may be out of luck here.

你在这里可能不走运。

The "htmlWorker" which is used to parse the html tags, doesn't seem to support the "input" tag.

用于解析 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";

You can access the source code for "HtmlWorker" from here. http://www.java2s.com/Open-Source/Java-Document/PDF/pdf-itext/com/lowagie/text/html/simpleparser/HTMLWorker.java.htm
It is from this source that I figured that out.

您可以从这里访问“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
 // ...
}

回答by Mark Storer

The only alternative I'm aware of at that point is to hack iText. The new XMLWorker should be considerably more extensible than The Old Way (HTMLWorker), but it'll still be Non Trivial.

那时我知道的唯一替代方法是破解 iText。新的 XMLWorker 应该比旧的方式 (HTMLWorker) 更具可扩展性,但它仍然是非平凡的。

There might be some magic style tag you can pass in that will show up in a "generic tag" for a PdfPageEventHandler... lets see here...

可能有一些您可以传入的魔术样式标签将显示在 PdfPageEventHandler 的“通用标签”中……让我们看看这里……

Reading the code, it looks like a style or attribute "generictag" will be propagated to the ...text.Chunkobject via setGenericTag().

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

So what you need to do is XSLT your unsupported tags into div/p/whatever with a "generictag" attribute that is a string which encodes the information you need to recreate the original element.

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

In your PdfPageEventHandler's OnGenericTag function, you have to parse that tag and recreate whatever it is you're trying to recreate.




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




That's just crazy enough to work!

这简直是​​疯狂到可以工作!