谷歌插件生成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>