【问题标题】:How To convert a large table to PDF using flying saucer?如何使用飞碟将大表格转换为 PDF?
【发布时间】:2012-11-15 00:00:42
【问题描述】:

我有一个包含大量列的 html(您可以在 link 找到示例)

现在,当我尝试使用 flying saucerjar link 重新编译以使用 iText 2.1.X)将其转换为 PDF 时,generated PDF 已截断列

有没有办法让飞碟根据html内容要么打破桌子,要么增加页面的宽度?

这是我正在使用的代码

String doc = file.toURI().toURL().toString();
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(doc);
String outputFile = "test.pdf";
OutputStream os = new FileOutputStream(outputFile);
renderer.layout();
renderer.createPDF(os);
os.flush();
os.close();

file 是我要转换的 html。

【问题讨论】:

    标签: java itext flying-saucer html-to-pdf


    【解决方案1】:

    如果您知道所需的大小,可以更改页面大小。

    为此使用@page 规则:
    请注意:在此示例中,我使用Jsoup 处理html(请参阅评论)。

    /*
     * This part is optional - Jsoup is used for cleaning the html and inserting the style tag into the head.
     * You can use everything else for doing this.
     * 
     * If you will use Jsoup, make shure you set proper charset (2nd parameter).
     * 
     * Note: this is NOT a W3C Document but a Jsoup one.
     */
    Document doc = Jsoup.parse(file, null);
    
    /*
     * Here you specify the pagesize you need (size: with height).
     * Inserting this html is the key part!
     */
    doc.head().append("<style type=\"text/css\"><!--@page { size:50.0cm 20.0cm; }--></style>");
    
    
    ITextRenderer renderer = new ITextRenderer();
    
    /*
     * This part ist jsoup related. 'doc.toString()' does nothing else than
     * returning the Html of 'doc' as a string.
     * 
     * You can set it like in your code too.
     */
    renderer.setDocumentFromString(doc.toString());
    
    final String outputFile = "test.pdf";
    OutputStream os = new FileOutputStream(outputFile);
    renderer.layout();
    renderer.createPDF(os);
    os.flush();
    os.close();
    

    使用此代码,您将获得一个 Pdf,其中整个表格位于横向页面上(也许您必须根据需要更改宽度/高度。

    【讨论】:

    • 谢谢你的回答,但我不知道页面的大小,因为内容 html 是动态生成的,所以它可以有 2 列或 20 列,这完全取决于类型生成的报告以及表格单元格内的内容可以增加列的宽度
    • 我明白了……您可以在这里检查page-break settingsFS extensions 是否可以帮助您。但我想FS不可能计算页面大小。如果一切都变糟了,你已经通过它的内容来计算表格的宽度(例如,总结所有单元格的文本长度并设置适当的宽度)。桌子的高度应该不是问题,因为您可以在这里使用page-break(见第一个链接)。
    【解决方案2】:

    使用YAHP library。这是迄今为止我工作过的最好的将 HTML 转换为 PDF 的库。这是写在飞碟顶部的,与它的受欢迎程度相比,这是一个很大的失望。它甚至不会呈现简单的输入文本框。所以,我求助于 YAHP 库,它非常适合你的情况。

    在获得与此库相关的所有 jar 后尝试此代码。

    import java.io.File;
    import java.io.FileOutputStream;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import org.allcolor.yahp.converter.CYaHPConverter;
    import org.allcolor.yahp.converter.IHtmlToPdfTransformer;
    import org.htmlcleaner.CleanerProperties;
    import org.htmlcleaner.HtmlCleaner;
    import org.htmlcleaner.PrettyHtmlSerializer;
    import org.htmlcleaner.TagNode;
    
    public class YahpHtmlToPdf {
    
        @SuppressWarnings({ "unchecked", "rawtypes" })
        public static void main(String[] args) {
            try{
                CleanerProperties props = new CleanerProperties();
                props.setTranslateSpecialEntities(true);
                props.setTransResCharsToNCR(true);
                props.setOmitComments(true);
                TagNode tagNode = new HtmlCleaner(props).clean(new File("C:\\Users\\MyComputer\\Desktop\\aspose.html"));
                String newString=new PrettyHtmlSerializer(props).getAsString(tagNode, "ISO-8859-1");
                CYaHPConverter converter = new CYaHPConverter();
                File fout = new File("C:\\sample\\aspose.pdf");
                FileOutputStream out = new FileOutputStream(fout);
                Map properties = new HashMap();
                List headerFooterList = new ArrayList();
                properties.put(IHtmlToPdfTransformer.PDF_RENDERER_CLASS,IHtmlToPdfTransformer.FLYINGSAUCER_PDF_RENDERER);
                converter.convertToPdf(newString,IHtmlToPdfTransformer.A1P,headerFooterList, "file:///temp/",out,properties);
                out.flush();
                out.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }   
    
    }
    

    这是使用您的 html 生成的 pdf 的屏幕截图。 .你可以像IHtmlToPdfTransformer.A1P这样指定页面大小。

    【讨论】:

    • 但是我仍然需要设置我不知道的页面宽度。列数可以是 2,3 或 20。html 是动态创建的
    • 在上面的API中可以根据表格大小设置页面的宽度和高度。
    • 我不知道表格大小,要知道我需要解析 html
    猜你喜欢
    • 1970-01-01
    • 2019-02-04
    • 2013-05-05
    • 2015-05-18
    • 1970-01-01
    • 2011-08-05
    • 2016-06-26
    • 2016-05-28
    • 1970-01-01
    相关资源
    最近更新 更多