我使用iText将XHTML转换为PDF。我使用XLSX到HTML转换器创建了XHTML并进行了清理。 Here您可以看到HTML页面。关键是我无法在A4页面上以等效的PDF格式转换它。我尝试了最近和较旧的iText库,使用了ITextRenderer,XMLWorkerHelper和HTMLWorker,但没有人正确创建PDF。按照我的尝试。
外部CSS示例(HTML和CSS是路径):
com.itextpdf.text.Document document = new com.itextpdf.text.Document(PageSize.A4);
PdfWriter pdfWriter = PdfWriter.getInstance
(document, new FileOutputStream(PDF));
document.open();
document.addAuthor("Real Gagnon");
document.addCreator("Real's HowTo");
document.addSubject("Thanks for your support");
document.addCreationDate();
document.addTitle("Please read this");
XMLWorkerHelper worker = XMLWorkerHelper.getInstance();
String str = readHtml();
worker.parseXHtml(pdfWriter, document, new FileInputStream(HTML), new FileInputStream(CSS));
document.close();
使用ITextRenderer和内部CSS的示例,但由于它没有考虑字体标记,我以编程方式添加了字体:
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(new ByteArrayInputStream(readHtml().getBytes("UTF-8")));
ITextRenderer renderer = new ITextRenderer();
File tmpFontFile = new File(
"C:\\Android\\workspace\\GestioneCommesse\\WebContent\\resources\\font\\arial_narrow.ttf");
renderer.getFontResolver().addFont(tmpFontFile.getAbsolutePath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
renderer.setDocument(doc, null);
FileOutputStream os = new FileOutputStream(PDF);
Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
tf.setOutputProperty(OutputKeys.INDENT, "yes");
tf.transform(new DOMSource(doc), new StreamResult(os));
os.close();
File file = new File("c:\\temp.pdf");
file.createNewFile();
OutputStream os2 = new FileOutputStream(file);
renderer.layout();
renderer.createPDF(os2);
os.close();
在这里你可以看到我得到的两个结果。在一个pdf中,整个css丢失,而另一个我无法改变宽度和字体样式:
Example1已使用XmlWorkerHelper创建,Example2使用iTextRenderer创建
以THIS为例,我得到结果2
答案 0 :(得分:1)
我正在处理一个项目,我也有Font问题。我在html页面上用刷子脚本字体设置了一个div,当我创建PDF时,字体没有在PDF上显示。我注意到,通过将引号从单个更改为双,它对我有效。
以前是我的:
< div style =" font-family:' Brush Script MT';" >< / div>
(注意单引号和双引号的位置,这不起作用) 然后我试了
< div style =' font-family:"刷脚本MT&#34 ;;'>
(起初它本身不起作用)
然后我使用FontFactory注册了字体并为其指定了一个具有相同名称的别名。
FontFactory.RegisterDirectories();
var fontPath = Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\BRUSHSCI.TTF";
FontFactory.Register(fontPath, "Brush Script MT");
希望这有帮助
答案 1 :(得分:0)
我正在与iText合作开展一个类似的项目,到目前为止我只是倾向于试图完全理解它是如何工作的:P
但在这种情况下,您只需在print css中添加页边距即可。 类似的东西:
@page {
margin-left: 10px;
margin-right: 10px;
margin-top: 10px;
margin-bottom: 10px;
}
我尝试使用自己的WebApp转换您的html源代码,但它运行正常。它也适合你(使用例子#2)。
小提示:我从不以像素为单位声明宽度,因为这就是发生的事情(由于iText的转换,内容会从页面中移出)。如果你删除了所有的width =“”标签,即使没有页边距也可以获得相同的结果。
侨!