【问题标题】:Saving html to pdf in chrome在chrome中将html保存为pdf
【发布时间】:2017-05-27 01:34:38
【问题描述】:

我正在使用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 to word 使用 save as in word 可以很好地解决一些问题,我可以打印 pdf,但不如直接从 pdf 打印。

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

打印选项没有问题

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

你有什么我遗漏的地方或问题所在的指针吗?

【问题讨论】:

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


    【解决方案1】:

    在 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 markdown 模板使用 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 的副本,因为它会在以后的渲染中被压缩(即您需要在每次渲染时将其复制回来)。

    您不能只链接到具有较少脑死打印媒体查询的单独 CSS 文件,因为 color: #000 !important; 会影响所有标签,这要归功于 * 目标,您不能只是将其重置为 initial 或继承`,因为那也会把它们变黑。

    您的最终(可能也是最好的)选择是制作自己的 R Markdown 模板(请参阅 https://github.com/hrbrmstr/markdowntemplates 了解更多信息)并避免在其中放置过度的印刷媒体查询。

    【讨论】:

    • 谢谢!这是我在 SO 中读到的最深入的答案之一。
    猜你喜欢
    • 2017-01-14
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 2021-12-13
    相关资源
    最近更新 更多