我正在使用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">⇓ </font>'
diff_mat[diff_mat>0] <- '<font color="red">⇑ </font>'
diff_mat[diff_mat == 0] <- '<font color="blue">⇔ </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打印好。
当我尝试将其保存为chrome中的pdf时,颜色会丢失。
我们心爱的网站Replace NA's using data from Multiple Columns中的其他网页,例如此问题,打印得很好
你有什么指示我错过了一个观点或问题所在。
答案 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),并避免在其中放置过多的打印媒体查询。