DT::datatable() 导出为 pdf,同时为多行单元格保留 HTML </br>

DT::datatable() export to pdf while preserving HTML </br> for multiline cells

尝试在 R 中使用 DT::datatable() 将包含多行单元格的 table 导出为 pdf。 DT::datatable() 适用于多行单元格,但在尝试导出为 pdf 时会出现问题。我尝试了两种不同的方法,每种方法都有自己的问题。 有很多关于导出为 pdf 时保持格式的话题,但是 none 关于导出多行单元格。

方法 1: Buttons 扩展的 pdf 打印按钮,带有参数 escape = FALSEexportOptions = list(stripHtml = FALSE) 并自定义 JS() 函数。

这里的问题是格式没有保留(在 Rstudio 中,在导出为 pdf 之前它看起来很棒)。此解决方案 () 非常适合为 headers、颜色、对齐方式等指定某些格式(正如我在 customize 参数中尝试过的那样)。但是,我想做的是在值中保留 HTML 格式,即多行单元格 ("A</br>B</br>C")。有谁知道我需要将哪个 JS() 函数传递给 customize 参数,以便相应地读取和打印 </br>?或者还有其他方法吗?

if (!require('DT')) install.packages('DT'); library(DT)

dt <- data.frame(Numbers = 1:100, Letter = paste0(c("A", "B", "C", "D", "E", "F"), collapse = "</br>"))

datatable(dt, 
          rownames = FALSE, 
          escape = FALSE,
          extensions = c("Buttons"),
          options = list(
            dom = 'Blfrtip',
            buttons = list(
              list(extend = "pdf", 
                   exportOptions = list(stripHtml = FALSE,
                                        columns = ':visible'),
                   orientation = 'portrait',
                   customize = JS("function(doc){
                                  doc.styles.tableHeader.color='yellow';
                                  doc.defaultStyle.alignment = 'left';
                                  doc.styles.tableHeader.alignment = 'left';
                                  doc.pageMargins = [10,10,10,10];
                                  doc.defaultStyle.fontSize = 7;
                                  doc.styles.tableHeader.fontSize = 7;
                                  doc.styles.title.fontSize = 9;
                                  }"
                                  )))))

方法二:使用saveWidget()datatableobject保存到html,然后使用[=打印网页29=]。这里保留了格式,但它只是制作了一个很长的pdf,如果你想打印它就没用了。我试图找到一个可以将此 pdf 拆分为 A4 页面的函数:webshot::resize()dev.print(onefile=F)staplr::split_pdf()tabulizer::split_pdf(),但无法正常工作。

if (!require('webshot')) install.packages('webshot'); library(webshot)
if (!require('DT')) install.packages('DT'); library(DT)

df <- data.frame(No = 1:100, Letter = paste0(c("A", "B", "C", "D", "E", "F"), collapse = "</br>"))

dtable <- datatable(df,
                     rownames = T,
                     width = '100%',
                     height = '100%',
                     escape = FALSE,
                     options = list(
                       pageLength = 200,
                       dom = 't'
                     ))

html <- "dtable.html"
saveWidget(dtable, html)
webshot(html, "dtable.pdf")

我觉得我让这件事变得比它应该做的更难了。我错过了什么吗?除了 DT::datatable() 之外,还有其他方法可以通过 R 将多行单元格导出为 pdf 格式吗?

knitr::kablewkhtmltopdf 的组合起到了作用:它确保多行单元格的格式,生成多页 pdf,每页有 table headers。

if (!require('kableExtra')) install.packages('kableExtra'); library(kableExtra)

dt <- data.frame(Numbers = 1:100, Letter = paste0(c("A", "B", "C", "D", "E", "F"), collapse = "<br>"))

# make html file
kbl(dt, escape = FALSE) %>%
  kable_paper() %>%
  save_kable(file = "table1.html", self_contained = F)

# convert to pdf
system("wkhtmltopdf --enable-local-file-access table1.html file.pdf")

wkhtmltopdf是一个命令运行开源应用程序,您可以在这里下载:https://wkhtmltopdf.org/downloads.html

如果要更改 table 或 pdf 的外观,请参阅 https://wkhtmltopdf.org/usage/wkhtmltopdf.txt and https://cran.r-project.org/web/packages/kableExtra/vignettes/awesome_table_in_html.html