HTML в PDF с помощью iText: Как можно создать флажок - PullRequest
5 голосов
/ 26 мая 2011

У меня есть простая 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();
    }
}

Ответы [ 4 ]

6 голосов
/ 26 мая 2011

Вы генерируете HTML?

Если это так, то вместо использования флажка HTML вы можете использовать символ «урна для голосования» Юникода, который является или &#x2610;. Это просто коробка, вы не можете пометить ее электронным способом или снять галочку; но если PDF предназначен для печати, то, конечно, люди могут пометить его ручкой или карандашом.

Например:

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

Обратите внимание, что это будет работать, только если вы используете шрифт Unicode в вашем PDF; Я думаю, что iText не будет использовать шрифт Unicode, если вы не скажете это.

4 голосов
/ 26 мая 2011

Вам может не повезти.

«htmlWorker», который используется для разбора тегов html, похоже, не поддерживает тег «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 голосов
/ 26 мая 2011

Создание PDF-файлов с помощью iText из HTML немного проблематично.для этого советую использовать библиотеку летающих тарелок.он также использует iText в фоновом режиме.

2 голосов
/ 26 мая 2011

Единственная альтернатива, которую я знаю на данный момент, - это взломать iText.Новый XMLWorker должен быть значительно более расширяемым, чем The Old Way (HTMLWorker), но все равно он будет не тривиальным.

Возможно, есть какой-то магический тег, который вы можете передать, который будет отображаться в «универсальном»тег "для PdfPageEventHandler ... давайте посмотрим здесь ...

Читая код, похоже, что стиль или атрибут" generictag "будут переданы объекту ...text.Chunk через setGenericTag().

Итак, вам нужно сделать XSLT ваших неподдерживаемых тегов в div / p / что угодно с атрибутом «generictag», который представляет собой строку, которая кодирует информацию, необходимую для воссоздания исходного элемента.

Вфункция OnGenericTag вашего PdfPageEventHandler, вы должны проанализировать этот тег и воссоздать все, что вы пытаетесь воссоздать.




Это просто безумие!

...