如何使用飞碟将大表格转换为PDF?

时间:2012-11-27 11:15:04

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

我有一个包含大量列的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();

文件是我要转换的html。

2 个答案:

答案 0 :(得分:2)

使用YAHP库。这是迄今为止我将HTML转换为PDF的最佳库。这是写在飞碟的顶部,与它的受欢迎程度相比,这是一个很大的失望。它甚至不会渲染简单的输入文本框。所以,我转向YAHP库,这对你的情况非常好。 / p>

在获得与此库相关的所有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();
        }
    }   

}

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

答案 1 :(得分: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,其中整个表位于横向页面上(可能您需要根据需要更改宽度/高度。