谷歌插件生成PDF实现

谷歌插件生成PDF

360brower

360官网 Linux版本下载
RPM安装: rpm -ivh browser360-cn-stable-10.6.1001.29-1.aarch64.rpm
安装目录: whereis browser360-cn
查看软连接: readlink -f google-chrome
创建软连接: ln -s /usr/bin/browser360-cn /home/appuser/google-chrome
详情可参考 官方文档

谷歌

谷歌插件用官方提供的版本即可
本地安装谷歌浏览器即可

使用说明

方法入口:DocumentPrint.printPdf(PrintArguments printArguments)
PrintArguments:
pdfRenderingData 动态渲染的数据
renderingDataPath 存储动态渲染数据的路径,该路径用于前端模板读取动态渲染的数据

核心类

public class ChromeCmd implements Serializable {

    private static final String CMD0 = "/bin/sh -c ";
    private static final String WINDOWS_CMD0 = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe ";
    private static final String MACOSX_CMD0 = "/bin/sh -c ";
    private static final String CMD1 = "google-chrome ";
    private static final String MACOSX_CMD1 = "Google\\ Chrome ";
    private String cmd2 = "--headless --disable-dev-shm-usage --disable-gpu --run-all-compositor-stages-before-draw --virtual-time-budget=600000 --print-to-pdf-no-header --print-to-pdf=";
    private static final String CMD3 = "'";
    private String cmd4;
    private static final String CMD5 = "'";
    private static final String CMD6 = " ";
    private String cmd7;


    private ChromeCmd(String cmd2, String cmd4, String cmd7) {
        if(StrUtil.isNotBlank(cmd2)){
            this.cmd2 = cmd2;
        }
        this.cmd4 = cmd4;
        this.cmd7 = cmd7;
    }

    public static ChromeCmd buildCmd(String cmd, String pdfSavePath, String htmlUrl) {
        if(StrUtil.isBlank(pdfSavePath) || StrUtil.isBlank(htmlUrl)){
            throw new RuntimeException("未找到HTML访问路径或PDF存储路径");
        }
        return  new ChromeCmd(cmd, pdfSavePath, htmlUrl);
    }

    @Override
    public String toString(){
        StringBuilder cmd = new StringBuilder();
        OsInfo osInfo = SystemUtil.getOsInfo();
        if (osInfo.isLinux()) {
            cmd.append(CMD1).append(cmd2).append(CMD3).append(cmd4).append(CMD5).append(CMD6).append(cmd7);
        }
        else if (osInfo.isWindows()) {
            cmd.append(WINDOWS_CMD0).append(cmd2).append(cmd4).append(CMD6).append(cmd7);
        }
        else if(osInfo.isMacOsX()){
            cmd.append(MACOSX_CMD1).append(cmd2).append(CMD3).append(cmd4).append(CMD5).append(CMD6).append(cmd7);
        }
        else {
            throw new RuntimeException("OS[" + osInfo.getName() + "] not support!");
        }
        return cmd.toString();
    }

}
public class DocumentPrint {

	public static String printPdf(PrintArguments printArguments){
		ChromeCmd chromeCmd = ChromeCmd.buildCmd(printArguments.getChromeCmd(),
				printArguments.getPdfSavePath(),printArguments.getPdfTmplUrl());
		String chromeOptions = chromeCmd.toString();
		OsInfo osInfo = SystemUtil.getOsInfo();
		if (osInfo.isWindows()) {
			RuntimeUtil.execForStr(chromeOptions);
		}
		else {
			String[] cmd = new String[]{"/bin/sh","-c",chromeOptions};
			RuntimeUtil.execForStr(cmd);
		}
		return printArguments.getPdfSavePath();
	}
}
public class PrintArguments {

	private static final String PDF_SUFFIX = ".pdf";
	private static final String CONNECTOR = "-";

	private String pdfSysDirs;

	/** 存储pdf的自定义文件夹文件夹 */
	private String pdfSavePath;
	/** 访问HTML的URL */
	private String pdfTmplUrl;
	/** PDF名称 */
	private String pdfName;
	/** 渲染pdf模板的数据 */
	private String pdfRenderingData;
	/** 渲染数据的存储路径,模板在读取数据时直接从改路径下获取*/
	private String renderingDataPath;

	/** 自定义谷歌命令 */
	private String chromeCmd;


	public PrintArguments(String pdfName, String pdfSysDirs, String pdfTmplUrl) {
		Assert.notBlank(pdfSysDirs,"[Assertion failed] - argument 'pdfSysDirs' must have text; it must not be null, empty, or blank");
		Assert.notBlank(pdfTmplUrl,"[Assertion failed] - argument 'pdfTmplUrl' must have text; it must not be null, empty, or blank");
		this.pdfTmplUrl = pdfTmplUrl;
		this.pdfSysDirs = pdfSysDirs;
		this.pdfName = StrUtil.isBlank(pdfName) ? IdUtil.simpleUUID() : pdfName + CONNECTOR + IdUtil.simpleUUID();
		this.pdfSavePath = pdfSysDirs.endsWith(File.separator) ? (pdfSysDirs + this.pdfName + PDF_SUFFIX )
				:  (pdfSysDirs + File.separator + IdUtil.simpleUUID() + PDF_SUFFIX );
	}

	public String getPdfSavePath() {
		return pdfSavePath;
	}

	public String getPdfTmplUrl() {
		return pdfTmplUrl;
	}

	public String getPdfName() {
		return pdfName;
	}

	public String getPdfRenderingData() {
		return pdfRenderingData;
	}

	public void setPdfRenderingData(String renderingDataPath, String pdfRenderingData) {
		Assert.notBlank(renderingDataPath,"[Assertion failed] - argument 'renderingDataDirs' must have text; it must not be null, empty, or blank");
		Assert.notBlank(pdfRenderingData,"[Assertion failed] - argument 'pdfRenderingData' must have text; it must not be null, empty, or blank");
		FileUtil.writeString(pdfRenderingData,renderingDataPath, Charset.defaultCharset());
		this.pdfRenderingData = pdfRenderingData;
		this.renderingDataPath = renderingDataPath;
	}

	public String getRenderingDataPath() {
		return renderingDataPath;
	}

	public String getChromeCmd() {
		return chromeCmd;
	}

	public void setChromeCmd(String chromeCmd) {
		this.chromeCmd = chromeCmd;
	}

	public String getPdfSysDirs() {
		return pdfSysDirs;
	}
}

工具类依赖

   <dependencies>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.20</version>
        </dependency>
   </dependencies>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值