html格式转pdf格式

本文介绍了在将HTML转换为PDF过程中遇到的问题及解决方法,包括PD4ML库的颜色显示问题,以及使用wkhtmltopdf工具时的注意事项,如安装路径、文件名和本地HTML的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网上找了好多资料,发现有些问题根本就没有指出来,对于第一次接触的人来说,处理起来比较吃力。现在我把一些自己遇到的问题在本文中提出来。

一、PD4ML

官网:http://pd4ml.com/downloads.htm

jar包:pd4ml.jar、ss_css2.jar

package pd4ml;

import java.awt.Insets;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.InvalidParameterException;

import org.zefer.pd4ml.PD4Constants;
import org.zefer.pd4ml.PD4ML;
public class pd4ml{
    protected int topValue = 0; 
    protected int leftValue = 0; 
    protected int rightValue = 0; 
    protected int bottomValue = 0; 
    protected int userSpaceWidth = 1300; 
 
    public static void main(String[] args) { 
        try { 
            pd4ml pdf = new pd4ml(); 
            String path = "D:/test/Level up.html";
            pdf.doConversion("file:///"+path, "D:/test/pd4ml.pdf"); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 
 
    public void doConversion( String url, String outputPath )  
                throws InvalidParameterException, MalformedURLException, IOException { 
        File output = new File(outputPath); 
        java.io.FileOutputStream fos = new java.io.FileOutputStream(output); 
 
        PD4ML pd4ml = new PD4ML(); 
        //页面高度
        pd4ml.setHtmlWidth(userSpaceWidth); 
        //PDF纸张类型A4
        pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4));  
        //PDF上下左右大小
        pd4ml.setPageInsetsMM(new Insets(topValue, leftValue, bottomValue, rightValue));  
        pd4ml.addStyle("BODY {margin: 0}", true);
        //控制台输出信息
        pd4ml.enableDebugInfo();
        //获取计算机字体格式
        pd4ml.useTTF("c:/windows/fonts", true); 
        //从URL到文件的实际文档转换
        pd4ml.render(new URL(url), fos);
        fos.close(); 
        
        System.out.println( outputPath + "\ndone." ); 
    } 
}

问题1:

pdf.doConversion("file:///"+path, "D:/test/pd4ml.pdf"); 
如果你想要转换的是本地的html,那么就需要在前面加入file:///,为什么要3个斜杠呢?主要是为了转义。


问题2:

有些样式不能显示,比如:颜色。


二、wkhtmltopdf

官网下载:https://wkhtmltopdf.org/downloads.html

jar:无

package webTest.pd4ml;

import java.io.File;

public class HtmlToPdf {
    //官网下载地址:https://wkhtmltopdf.org/downloads.html
    //获取执行下载好的.exe保存在服务器地址
    private static final String toPdfTool = "C:/Program Files/wkhtmltopdf/bin/wkhtmltopdf.exe";  
      
    /** 
     * html转pdf 
     * @param srcPath html路径,可以是硬盘上的路径(file:///),也可以是网络路径
     * @param destPath pdf保存路径 
     * @return 转换成功返回true 
     */  
    public static boolean convert(String srcPath, String destPath){  
        File file = new File(destPath);  
        File parent = file.getParentFile();  
        //如果pdf保存路径不存在,则创建路径  
        if(!parent.exists()){  
            parent.mkdirs();  
        }  
          
        StringBuilder cmd = new StringBuilder();  
        cmd.append(toPdfTool);  
        cmd.append(" ");  
        cmd.append(srcPath);  
        cmd.append(" ");  
        cmd.append(destPath);  
          
        boolean result = true;  
        try{  
            Process proc = Runtime.getRuntime().exec(cmd.toString());  
            HtmlToPdfInterceptor error = new HtmlToPdfInterceptor(proc.getErrorStream());  
            HtmlToPdfInterceptor output = new HtmlToPdfInterceptor(proc.getInputStream());  
            error.start();  
            output.start();  
            proc.waitFor();  
        }catch(Exception e){  
            result = false;  
            e.printStackTrace();  
        }  
          
        return result;  
    }
    
    public static void main(String[] args){
    	HtmlToPdf pdf = new HtmlToPdf();
    	pdf.convert("file:///D:/test/Levelup.html", "D:/test/Levelup.pdf");
    }
}
package webTest.pd4ml;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class HtmlToPdfInterceptor extends Thread {
    private InputStream is;  
    
    public HtmlToPdfInterceptor(InputStream is){  
        this.is = is;  
    }  
      
    public void run(){  
        try{  
            InputStreamReader isr = new InputStreamReader(is, "utf-8");  
            BufferedReader br = new BufferedReader(isr);  
            String line = null;  
            while ((line = br.readLine()) != null) {  
                System.out.println(line.toString()); //输出内容  
            }  
        }catch (IOException e){  
            e.printStackTrace();  
        }  
    }  
}

问题1:

wkhtmltopdf.exe这个文件下载安装后才会出现,下载地址上面有写。按照自己的电脑下载即可。下载完成后名字不是wkhtmltopdf.exe这个需要注意。之后运行这个下载好的exe


安装成功后,找到自己的安装路径里面的bin文件下的wkhtmltopdf.exe。我的路径是C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe


问题2:复制自己的文件路径时,记得修改斜杠,下面代码这样即可

private static final String toPdfTool = "C:/Program Files/wkhtmltopdf/bin/wkhtmltopdf.exe";

问题3:如果是本地的html,需要加入file:///

pdf.convert("file:///D:/test/Levelup.html", "D:/test/Levelup.pdf");

jar包下载地址:http://download.youkuaiyun.com/download/k905904/10024472

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值