使用IText将XHTML转换为PDF - 需要专家

时间:2014-05-23 21:17:24

标签: css itext html-to-pdf

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

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 =“”标签,即使没有页边距也可以获得相同的结果。

侨!