0

我正在使用 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

4

2 回答 2

1

我正在做一个项目,我也遇到了字体问题。我在 html 页面上用刷子脚本字体设计了一个 div,当我创建 PDF 时,字体没有显示在 PDF 上。我注意到通过将引号从单引号更改为双引号对我有用。

这是我以前的:

< div style="font-family : 'Brush Script MT';" ></div>

(注意单引号和双引号的位置,这不起作用)然后我尝试了

<div style='font-family : "Brush Script MT";'>

(起初它本身不起作用)

但后来我使用 FontFactory 注册了字体,并给了它一个同名的别名。

FontFactory.RegisterDirectories();
var fontPath = Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\BRUSHSCI.TTF";
FontFactory.Register(fontPath, "Brush Script MT");

希望这可以帮助

于 2014-05-25T10:12:29.237 回答
0

我在一个类似的项目中使用 iText,到目前为止,我只是放弃尝试完全理解它是如何工作的:P

但在这种情况下,您只需要在打印 css 中添加页边距。就像是:

@page {  
margin-left: 10px;  
margin-right: 10px;  
margin-top: 10px;  
margin-bottom: 10px;  
} 

我尝试使用我自己的 WebApp 转换您的 html 源,它工作得很好。它也应该对您有用(使用示例#2)。

一个小提示:我从不以像素为单位声明宽度,因为这是会发生的(由于 iText 的转换,内容会超出页面)。如果您删除所有 width="" 标签,即使没有页边距,您也应该得到相同的结果。

再见!

于 2014-05-24T19:20:32.367 回答