我有一个包含大量列的html(你可以在link找到样本)
现在当我尝试使用flying saucer(jar 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。
答案 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();
}
}
}
这是使用您的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,其中整个表位于横向页面上(可能您需要根据需要更改宽度/高度。