2017-10-17 140 views
2

我已经搜索了这些问题,但无法找到解决具体问题的解决方案。我需要做的是将包含图像和CSS样式的HTML文件转换为PDF。我使用的是iText 5,并且能够将样式包含到生成的PDF中。但是,我仍然在努力包括图像。我在下面列出了我的代码。具有绝对路径的图像包含在生成的PDF中,具有相对路径的图像不是。我知道我需要实现AbstractImageProvider,但我不知道该怎么做。任何帮助是极大的赞赏。使用iText将HTML和图像转换为PDF

Java文件:

public class Converter { 

    static String in = "C:/Users/APPS/Desktop/Test_Html/index.htm"; 
    static String out = "C:/Users/APPS/Desktop/index.pdf"; 
    static String css = "C:/Users/APPS/Desktop/Test_Html/style.css"; 

    public static void main(String[] args) { 
     try { 
      convertHtmlToPdf(); 
     } catch (DocumentException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private static void convertHtmlToPdf() throws DocumentException, IOException { 
     Document document = new Document(); 
     PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(out)); 
     document.open(); 
     XMLWorkerHelper.getInstance().parseXHtml(pdfWriter, document, new FileInputStream(in), new FileInputStream(css)); 
     document.close(); 
     System.out.println("PDF Created!"); 
    } 

    /** 
    * Not sure how to implement this 
    * @author APPS 
    * 
    */ 
    public class myImageProvider extends AbstractImageProvider { 

     @Override 
     public String getImageRootPath() { 
      // TODO Auto-generated method stub 
      return null; 
     } 

    } 

} 

HTML文件:

<!DOCTYPE html> 
<html lang="en"> 

<head> 
    <title>HTML to PDF</title> 
    <link href="style.css" rel="stylesheet" type="text/css" /> 
</head> 

<body> 
    <h1>HTML to PDF</h1> 
    <p> 
     <span class="itext">itext</span> 5.4.2 
     <span class="description"> converting HTML to PDF</span> 
    </p> 
    <table> 
     <tr> 
      <th class="label">Title</th> 
      <td>iText - Java HTML to PDF</td> 
     </tr> 
     <tr> 
      <th>URL</th> 
      <td>http://wwww.someurl.com</td> 
     </tr> 
    </table> 
    <div class="center"> 
     <h2>Here is an image</h2> 
     <div> 
      <img src="images/Vader_TFU.jpg" /> 
     </div> 
     <div> 
      <img src="https://www.w3schools.com/images/picture.jpg" alt="Mountain" /> 
     </div> 
    </div> 
</body> 
</html> 

CSS文件:

h1 { 
    color: #ccc; 
} 

table tr td { 
    text-align: center; 
    border: 1px solid gray; 
    padding: 4px; 
} 

table tr th { 
    background-color: #84C7FD; 
    color: #fff; 
    width: 100px; 
} 

.itext { 
    color: #84C7FD; 
    font-weight: bold; 
} 

.description { 
    color: gray; 
} 

.center { 
    text-align: center; 
} 

回答

3

以下是基于iText5 5.5.12版本

假设你有这个导演Y型结构:

enter image description here

有了这个代码,并使用最新的iText5:

package converthtmltopdf; 

import com.itextpdf.text.Document; 
import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.pdf.PdfWriter; 
import com.itextpdf.tool.xml.XMLWorker; 
import com.itextpdf.tool.xml.XMLWorkerHelper; 
import com.itextpdf.tool.xml.html.Tags; 
import com.itextpdf.tool.xml.net.FileRetrieve; 
import com.itextpdf.tool.xml.net.FileRetrieveImpl; 
import com.itextpdf.tool.xml.parser.XMLParser; 
import com.itextpdf.tool.xml.pipeline.css.CSSResolver; 
import com.itextpdf.tool.xml.pipeline.css.CssResolverPipeline; 
import com.itextpdf.tool.xml.pipeline.end.PdfWriterPipeline; 
import com.itextpdf.tool.xml.pipeline.html.AbstractImageProvider; 
import com.itextpdf.tool.xml.pipeline.html.HtmlPipeline; 
import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext; 
import com.itextpdf.tool.xml.pipeline.html.LinkProvider; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 

/** 
* 
* @author george.mavrommatis 
*/ 
public class ConvertHtmlToPdf { 
    public static final String HTML = "C:\\Users\\zzz\\Desktop\\itext\\index.html"; 
    public static final String DEST = "C:\\Users\\zzz\\Desktop\\itext\\index.pdf"; 
    public static final String IMG_PATH = "C:\\Users\\zzz\\Desktop\\itext\\"; 
    public static final String RELATIVE_PATH = "C:\\Users\\zzz\\Desktop\\itext\\"; 
    public static final String CSS_DIR = "C:\\Users\\zzz\\Desktop\\itext\\"; 

    /** 
    * Creates a PDF with the words "Hello World" 
    * @param file 
    * @throws IOException 
    * @throws DocumentException 
    */ 
    public void createPdf(String file) throws IOException, DocumentException { 
     // step 1 
     Document document = new Document(); 
     // step 2 
     PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file)); 
     // step 3 
     document.open(); 
     // step 4 

     // CSS 
     CSSResolver cssResolver = 
       XMLWorkerHelper.getInstance().getDefaultCssResolver(false); 
     FileRetrieve retrieve = new FileRetrieveImpl(CSS_DIR); 
     cssResolver.setFileRetrieve(retrieve); 

     // HTML 
     HtmlPipelineContext htmlContext = new HtmlPipelineContext(null); 
     htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory()); 
     htmlContext.setImageProvider(new AbstractImageProvider() { 
      public String getImageRootPath() { 
       return IMG_PATH; 
      } 
     }); 
     htmlContext.setLinkProvider(new LinkProvider() { 
      public String getLinkRoot() { 
       return RELATIVE_PATH; 
      } 
     }); 

     // Pipelines 
     PdfWriterPipeline pdf = new PdfWriterPipeline(document, writer); 
     HtmlPipeline html = new HtmlPipeline(htmlContext, pdf); 
     CssResolverPipeline css = new CssResolverPipeline(cssResolver, html); 

     // XML Worker 
     XMLWorker worker = new XMLWorker(css, true); 
     XMLParser p = new XMLParser(worker); 
     p.parse(new FileInputStream(HTML)); 

     // step 5 
     document.close(); 
    } 
    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) throws IOException, DocumentException { 
     // TODO code application logic here 
     new ConvertHtmlToPdf().createPdf(DEST); 
    } 

} 

这里是结果:

enter image description here

此示例使用代码:https://developers.itextpdf.com/examples/xml-worker-itext5/xml-worker-examples

希望这会有所帮助

+0

这工作完美!非常感谢。 – jdubicki

+0

@jdubicki很高兴我能够提供帮助。不要忘记,如果一个答案可以帮助你,你可以upvote它,然后接受它。谢谢 – MaVRoSCy

+0

我遇到了另一个需要帮助的问题。为了能够读取和呈现嵌套的无序列表,我不得不做一些修改。我注意到我的标题标签没有在PDF中解析,任何人都可以帮我解决这个问题。下面是我需要做的chages。 – jdubicki