java使用itext把含图片的html转为pdf

## java使用itext把含图片的html转为pdf
MAVEN 依赖
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.4.2</version>
</dependency>
<dependency>
    <groupId>org.xhtmlrenderer</groupId>
    <artifactId>core-renderer</artifactId>
    <version>R8</version>
</dependency>

利用itext将html转为PDF
import com.lowagie.text.pdf.BaseFont;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
 
public class HtmlToPDF {
 
    public static void main(String[] args) throws Exception {
        htmlToPdf("C://Users//Administrator//Desktop//20181001.pdf","C://Users//Administrator//Desktop//xse//newFile.html");
    }
 
    /**
     * 把URL转换为PDF
     * @param outputFile
     *            , 示例:/data/fs/inspector/BJ20150522001.pdf
     * @param url
     *            ,示例:http :xxxx
     * @return
     * @throws Exception
     */
    public static void htmlToPdf(String outputFile, String url)throws Exception {
        try{
            OutputStream os = new FileOutputStream(outputFile);
            ITextRenderer renderer = new ITextRenderer();
 
            // 如果携带图片则加上以下代码,将图片标签转换为Itext自己的图片对象
            renderer.getSharedContext().setReplacedElementFactory(new Base64ImgReplacedElementFactory());
            renderer.getSharedContext().getTextRenderer().setSmoothingThreshold(0);
 
            //String fontPath = HtmlToPDF.class.getClassLoader().getResource("").toString().replaceAll("file:/", "C:\\Users\\Administrator\\Downloads\\simsunttc\\") + "simsun.ttc";
            // 解决中文支持问题  字体必须名称必须和前台页面的大小写一直(simsun 区分大小写)
            String fontPath="C:\\Users\\Administrator\\Downloads\\simsunttc\\simsun.ttc";
            ITextFontResolver fontResolver = renderer.getFontResolver();
            fontResolver.addFont(fontPath, BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
 
            url=new File(url).toURI().toURL().toString();
            renderer.setDocument(url);
            //解决图片相对路径问题,window 上必须用file:/; 后面路径只写到img标签中src的上级目录即图片的当前目录
            renderer.getSharedContext().setBaseURL("file:/C:/Users/Administrator/Desktop/xse/");
 
            renderer.layout();
            renderer.createPDF(os);
            os.flush();
            os.close();
        }catch(Exception e ){
            e.printStackTrace();
        }
    }
 
}



import com.lowagie.text.BadElementException;
import com.lowagie.text.Image;
import com.lowagie.text.pdf.codec.Base64;
import org.w3c.dom.Element;
import org.xhtmlrenderer.extend.FSImage;
import org.xhtmlrenderer.extend.ReplacedElement;
import org.xhtmlrenderer.extend.ReplacedElementFactory;
import org.xhtmlrenderer.extend.UserAgentCallback;
import org.xhtmlrenderer.layout.LayoutContext;
import org.xhtmlrenderer.pdf.ITextFSImage;
import org.xhtmlrenderer.pdf.ITextImageElement;
import org.xhtmlrenderer.render.BlockBox;
import org.xhtmlrenderer.simple.extend.FormSubmissionListener;
import java.io.IOException;
 
/**
 *  * 图片base64支持,把图片转换为itext自己的图片对象
 *  * @author Administrator
 *  *
 *  
 */
public class Base64ImgReplacedElementFactory implements ReplacedElementFactory {
    /**
     *  * 实现createReplacedElement 替换html中的Img标签
     *  * 
     *  * @param c 上下文
     *  * @param box 盒子
     *  * @param uac 回调
     *  * @param cssWidth css宽
     *  * @param cssHeight css高
     *  * @return ReplacedElement
     *  
     */
    public ReplacedElement createReplacedElement(LayoutContext c, BlockBox box, UserAgentCallback uac,int cssWidth, int cssHeight) {
        Element e = box.getElement();
        if (e == null) {
            return null;
        }
        String nodeName = e.getNodeName();
        // 找到img标签
        if (nodeName.equals("img")) {
            String attribute = e.getAttribute("src");
            FSImage fsImage;
            try {
                // 生成itext图像
                fsImage = buildImage(attribute, uac);
            } catch (BadElementException e1) {
                fsImage = null;
            } catch (IOException e1) {
                fsImage = null;
            }
            if (fsImage != null) {
                // 对图像进行缩放
                if (cssWidth != -1 || cssHeight != -1) {
                    fsImage.scale(cssWidth, cssHeight);
                }
                return new ITextImageElement(fsImage);
            }
        }
        return null;
    }
 
    /**
     *  * 编解码base64并生成itext图像    
     *  
     */
    protected FSImage buildImage(String srcAttr, UserAgentCallback uac) throws IOException,
            BadElementException {
        FSImage fiImg = null;
        //图片的src要为src="https://img-blog.csdnimg.cn/2022010614464511393.jpg"这种base64格式
        if (srcAttr.toLowerCase().startsWith("data:image/")) {
            String base64Code = srcAttr.substring(srcAttr.indexOf("base64,") + "base64,".length(), srcAttr.length());
            // 解码
            byte[] decodedBytes = Base64.decode(base64Code);
            fiImg = new ITextFSImage(Image.getInstance(decodedBytes));
        } else {
            fiImg = uac.getImageResource(srcAttr).getImage();
        }
        return fiImg;
    }
 
    public void reset() {
    }
 
    @Override
    public void remove(Element arg0) {
    }
 
    @Override
    public void setFormSubmissionListener(FormSubmissionListener arg0) {
    }
 
}

转自:https://www.cnblogs.com/bert227/p/9724254.html

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,使用iTextPdfPTable类将Excel转换为PDF的步骤如下: 1. 添加iText库依赖 在您的Java项目,您需要添加iText库的依赖。您可以在iText官网上下载iText的jar包,然后将其添加到项目的classpath。 2. 使用POI库读取Excel文件 使用POI库读取Excel文件内容,并将其存储在Java程序。以下是一个示例代码: ```java FileInputStream inputStream = new FileInputStream(new File("example.xlsx")); Workbook workbook = new XSSFWorkbook(inputStream); Sheet sheet = workbook.getSheetAt(0); Iterator<Row> iterator = sheet.iterator(); ``` 3. 创建PDF文件 使用iText库创建一个新的PDF文件,并设置页面大小、边距等。以下是创建PDF文件的示例代码: ```java Document pdfDoc = new Document(PageSize.A4, 50, 50, 50, 50); PdfWriter.getInstance(pdfDoc, new FileOutputStream(new File("example.pdf"))); pdfDoc.open(); ``` 4. 将Excel表格转换为PDF表格 使用iTextPdfPTable类创建一个新的PDF表格,并将Excel表格的内容添加到PDF表格。以下是将Excel表格转换为PDF表格的示例代码: ```java PdfPTable pdfTable = new PdfPTable(3); PdfPCell cell; while (iterator.hasNext()) { Row row = iterator.next(); Iterator<Cell> cellIterator = row.cellIterator(); while (cellIterator.hasNext()) { Cell excelCell = cellIterator.next(); cell = new PdfPCell(new Phrase(excelCell.getStringCellValue())); pdfTable.addCell(cell); } } pdfDoc.add(pdfTable); ``` 5. 关闭PDF文件 使用pdfDoc.close()方法关闭PDF文件。 完整的示例代码如下: ```java import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Iterator; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import com.itextpdf.text.Document; import com.itextpdf.text.PageSize; import com.itextpdf.text.Phrase; import com.itextpdf.text.pdf.PdfPCell; import com.itextpdf.text.pdf.PdfPTable; import com.itextpdf.text.pdf.PdfWriter; public class ExcelToPdf { public static void main(String[] args) throws IOException { FileInputStream inputStream = new FileInputStream(new File("example.xlsx")); Workbook workbook = new XSSFWorkbook(inputStream); Sheet sheet = workbook.getSheetAt(0); Iterator<Row> iterator = sheet.iterator(); Document pdfDoc = new Document(PageSize.A4, 50, 50, 50, 50); PdfWriter.getInstance(pdfDoc, new FileOutputStream(new File("example.pdf"))); pdfDoc.open(); PdfPTable pdfTable = new PdfPTable(3); PdfPCell cell; while (iterator.hasNext()) { Row row = iterator.next(); Iterator<Cell> cellIterator = row.cellIterator(); while (cellIterator.hasNext()) { Cell excelCell = cellIterator.next(); cell = new PdfPCell(new Phrase(excelCell.getStringCellValue())); pdfTable.addCell(cell); } } pdfDoc.add(pdfTable); pdfDoc.close(); workbook.close(); inputStream.close(); } } ``` 希望这可以帮助您将Excel文件转换为PDF文件!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值