在Chrome中将html保存为pdf

时间:2017-01-12 03:48:54

标签: r google-chrome pdf-generation r-markdown

我正在使用rmarkdown生成HTML报告。我在限制机器上,无法安装tex。所以,我试图生成一个HTML文档,然后将其转换/打印为pdf。示例降价文档是:

---
title: "trials"
author: "Foo Bar"
date: "15 December 2016"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

```{r cars, echo=FALSE, cache=FALSE, message=FALSE}

library(dplyr, quietly = TRUE)
library(abind, quietly = TRUE)
virginica <- iris %>% filter(Species == "virginica") %>% head() %>% select(-Species)
setosa <- iris %>% filter(Species == "setosa") %>% head() %>% select(-Species)

diff_mat <- virginica - setosa


diff_mat[diff_mat<0] <- '<font color="green">&dArr; </font>'
diff_mat[diff_mat>0] <- '<font color="red">&uArr; </font>'
diff_mat[diff_mat == 0] <- '<font color="blue">&hArr; </font>'

datArray <- abind::abind(virginica, diff_mat, along=3)

fin_dat <- apply(datArray,1:2, function(x)paste(x[1],x[2], sep = " "))

knitr::kable(fin_dat, format = "html",
      escape = FALSE, table.attr = "border=1",
      caption = "Changes across species")

```

HTML formatted tables in rmarkdown word document中所讨论的那样格式丢失,我无法编辑。生成的HTML正是我想要的。使用另存为单词的HTML可以很好地解决一些问题,我可以打印pdf,但它不如直接从pdf打印好。 enter image description here

当我尝试将其保存为chrome中的pdf时,颜色会丢失。

enter image description here

打印选项没有问题 enter image description here

我们心爱的网站Replace NA's using data from Multiple Columns中的其他网页,例如此问题,打印得很好

enter image description here

你有什么指示我错过了一个观点或问题所在。

1 个答案:

答案 0 :(得分:6)

在YAML标题后添加此内容:

<style>
@media print {

  font[color="green"] {
    color: #00ff00!important;
    -webkit-print-color-adjust:exact;
  }

  font[color="red"] {
    color: #ff0000!important;
    -webkit-print-color-adjust:exact;
  }

}
</style>

问题是RStudio的默认R降价模板使用Bootstrap,其版本bootstrap.min.css具有:

@media print {
  *,
  *:before,
  *:after {
    color: #000 !important;
    text-shadow: none !important;
    background: transparent !important;
    -webkit-box-shadow: none !important;
            box-shadow: none !important;
  }

在里面。这是一个非常“破坏性”的媒体查询,因为*导致这些设置应用于所有标记,而color: #000 !important;意味着“没有你的颜色!” 打印文档时。我嘲笑背后的情绪(拯救地球+碳粉/墨水成本),但如果你打印到PDF,它没有任何意义。

不幸的是,没有用于打印到PDF的超目标媒体查询,因此当您将网页打印为PDF并且这些无意识的,全面的媒体查询接管时,会应用通用的“打印”媒体查询。

问题在于,您需要非常具体地定位任何其他标记以覆盖这些设置。这意味着将您自己的CSS类添加到您在Rmds中生成或变得舒适的任何内容中用“检查元素”直到你抓住所有。

然而,如果您有冒险精神,可以将YAML标题修改为:

output:
  html_document:
    self_contained: false

当你渲染到HTML时,它将创建一个目录,其中包含各种组件的子目录,而base64将它们编码为一个大文档。

我将我的文档命名为forso.Rmd,这意味着它创建了一个名为forso_files的目录,并将子目录放在其下。

打开主HTML文件并向下滚动,直到看到如下内容:

<script src="forso_files/jquery-1.11.3/jquery.min.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link href="forso_files/bootstrap-3.3.5/css/bootstrap.min.css" rel="stylesheet" />
<script src="forso_files/bootstrap-3.3.5/js/bootstrap.min.js"></script>
<script src="forso_files/bootstrap-3.3.5/shim/html5shiv.min.js"></script>
<script src="forso_files/bootstrap-3.3.5/shim/respond.min.js"></script>
<script src="forso_files/navigation-1.1/tabsets.js"></script>

改变这个:

<link href="forso_files/bootstrap-3.3.5/css/bootstrap.min.css" rel="stylesheet" />

为:

<link href="forso_files/bootstrap-3.3.5/css/bootstrap.css" rel="stylesheet" />

修改bootstrap.css,移除color: #000 !important;行并添加-webkit-print-color-adjust:exact;行。保存bootstrap.css ELSEWHERE的副本,因为它会在未来的渲染中被压扁(即你需要在每次渲染时将其复制回来)。

由于color: #000 !important;*目标导致initial影响所有代码,因此您不能仅使用较少的大脑死印刷媒体查询链接到单独的CSS文件,而且您无法将其重置为strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colProcessList = objWMIService.ExecQuery _ ("Select Name from Win32_Process WHERE Name LIKE 'java%'") If colProcessList.Count > 0 Then For Each objProcess In colProcessList objProcess.Terminate() Next End If Set objWMIService = Nothing Set colProcessList = Nothing 或继承`因为这也只会把它们变成黑色。

您的最终(也可能是最佳)选项是制作您自己的R Markdown模板(有关详细信息,请参阅https://github.com/hrbrmstr/markdowntemplates),并避免在其中放置过多的打印媒体查询。