我正在使用 iText 将 XHTML 转换为 PDF。我使用 XLSX 到 HTML 转换器创建了 XHTML,并进行了清理。在这里您可以看到 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创建的
有了这个例子,我得到了结果 2