image - 图的大小与 Markdown pandoc转换多克斯

  显示原文与译文双语对照的内容
0 0

我键入报表中使用Rmarkdown Rstudio 。 中进行转换时 html通过knitr,还有一个 markdown文件由knitr生成。 我将这个文件与 pandoc如下所示:

pandoc -f markdown -t docx input.md -o output.docx

output.docx文件不错除了一个问题: 这些数字的大小都没有改变,我需要手动调整人物Word 。 有什么做,或许还有一个选项与 pandoc,以获得正确的数字大小?

时间:原作者:9个回答

0 0

一种简单的方法在于包括缩放因子 k各个数据块中的选项:

{r, fig.width=8*k, fig.height=6*k}

和一个变量 dpi在全局存储块选择:

opts_chunk$set(dpi = dpi)

然后,可以设置的值。 dpik然后再编织 Rmd文件在全局环境中:

dpi <<- 96    
k <<- 1

也可以把设备设置为数据块中的 Rmd文件( 设置 k例如在第一个数据块) 。

原作者:
0 0

这里有个解决方案来调整图使用 ImageMagick 从R Script 。 70%比率似乎是一个不错的选择。

# the path containing the Rmd file :
wd <- "..."
setwd(wd)
# the folder containing the figures :
fig.path <- paste0(wd, "/figure")
# all png figures :
figures <- list.files(fig.path, pattern=".png", all.files=TRUE)
# (safety) create copies of the original files
dir.create(paste0(fig.path,"_copy"))
for(i in 1:length(figures)){
  fig <- paste0(fig.path, "/", figures[i])
  file.copy(fig,"figure_copy")
}
# resize all figures
for(i in 1:length(figures)){
    fig <- paste0(fig.path, "/", figures[i])
    comm <- paste("convert -resize 70%", fig, fig)
    shell(comm)
}
# then run pandoc from a command line  
# or from the pandoc() function :
library(knitr)
pandoc("MyReport.md", "docx")

更多信息有关 resize函数ImageMagick : www .perturb org

原作者:
0 0

这是我的解决方法: hack由Pandoc docx转换,如docx只是分发包xml文件和调整图的大小很容易。

以下就是中的图如下 word/document.xml提取从docx转换:

<w:p>
  <w:r>
    <w:drawing>
      <wp:inline>
        <wp:extent cx="1524000" cy="1524000" />
        ...
        <a:graphic>
          <a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
            <pic:pic>
              ...
              <pic:blipFill>
                <a:blip r:embed="rId23" />
                ...
              </pic:blipFill>
              <pic:spPr bwMode="auto">
                <a:xfrm>
                  <a:off x="0" y="0" />
                  <a:ext cx="1524000" cy="1524000" />
                </a:xfrm>
                ...
              </pic:spPr>
            </pic:pic>
          </a:graphicData>
        </a:graphic>
      </wp:inline>
    </w:drawing>
  </w:r>
</w:p>

所以替换 cx& cy节点的属性 wp:extent& a:ext根据所需的值将做调整作业。 下面的R 代码帮我搞定 最宽的图就占用一整行的宽度指定的变量 out.width,而剩下的按比例调整大小。

require(XML)
## default linewidth (inch) for Word 2003
out.width <- 5.77
docx.file <- "report.docx"
## unzip the docx converted by Pandoc
system(paste("unzip", docx.file, "-d temp_dir"))
document.xml <- "temp_dir/word/document.xml"
doc <- xmlParse(document.xml)
wp.extent <- getNodeSet(xmlRoot(doc), "//wp:extent")
a.blip <- getNodeSet(xmlRoot(doc), "//a:blip")
a.ext <- getNodeSet(xmlRoot(doc), "//a:ext")
figid <- sapply(a.blip, xmlGetAttr, "r:embed")
figname <- dir("temp_dir/word/media/")
stopifnot(length(figid) == length(figname))
pdffig <- paste("temp_dir/word/media/",
                ## in case figure ids in docx are not in dir'ed order
                sort(figname)[match(figid, substr(figname, 1, nchar(figname) - 4))], sep="")
## get dimension info of included pdf figures
pdfsize <- do.call(rbind, lapply(pdffig, function (x) {
    fig.ext <- substr(x, nchar(x) - 2, nchar(x))
    pp <- pipe(paste(ifelse(fig.ext == 'pdf', "pdfinfo", "file"), x, sep=" "))
    pdfinfo <- readLines(pp); close(pp)
    sizestr <- unlist(regmatches(pdfinfo, gregexpr("[[:digit:].]+ X [[:digit:].]+", pdfinfo, ignore.case=T)))
    as.numeric(strsplit(sizestr, split=" x ")[[1]])
}))
## resizing pdf figures in xml DOM, with the widest figure taking up a line's width
wp.cx <- round(out.width*914400*pdfsize[,1]/max(pdfsize[,1]))
wp.cy <- round(wp.cx*pdfsize[, 2]/pdfsize[, 1])
wp.cx <- as.character(wp.cx)
wp.cy <- as.character(wp.cy)
sapply(1:length(wp.extent), function (i)
       xmlAttrs(wp.extent[[i]]) <- c(cx = wp.cx[i], cy = wp.cy[i]));
sapply(1:length(a.ext), function (i)
       xmlAttrs(a.ext[[i]]) <- c(cx = wp.cx[i], cy = wp.cy[i]));
## save hacked xml back to docx
saveXML(doc, document.xml, indent = F)
setwd("temp_dir")
system(paste("zip -r ../", docx.file, " *", sep=""))
setwd("..")
system("rm -fr temp_dir")
原作者:
...