簡體   English   中英

如何使用magick::image_read_pdf獲取pdf文件的總頁數?

[英]How to get total number of pages of pdf files using magick::image_read_pdf?

假設在一個文件夾main_path下,我們有多個不同頁數的 pdf 文件,我使用下面的 function 循環所有文件並截圖每個頁面:

library(magick)
library(glue)

main_path <- './'

file_names <- list.files(path = main_path, pattern ='.pdf') 
file_paths <- file.path(main_path, file_names)
file_names_no_ext <- tools::file_path_sans_ext(file_names)

max_page <- 10
pdf2plot <- function(file_path, file_names_no_ext){
  pages <- magick::image_read_pdf(file_path)
  print(pages)
  num <- seq(1, max_page, 1)
  # num <- seq(1, nrow(data.frame(pages)), 1)
  for (i in num){
    pages[i] %>% image_write(., path = paste0(glue(main_path, '/plot/', {file_names_no_ext},
                                                   sprintf('_%02d.', i)), format = "png"))
  }
}

mapply(pdf2plot, file_paths, file_names_no_ext)

我遇到的問題是,如果文件夾中有一個文件的總頁數小於max_page ,它將Error in magick_image_subset(x, i): subscript out of bounds 例如,我有一個有 2 頁的文件,但我設置max_page=10 ,我會得到這個錯誤。

pages內容:

  format width height colorspace matte filesize density
  <chr>  <int>  <int> <chr>      <lgl>    <int> <chr>  
1 PNG     2250   3000 sRGB       TRUE         0 300x300
2 PNG     2250   3000 sRGB       TRUE         0 300x300
3 PNG     2250   3000 sRGB       TRUE         0 300x300
4 PNG     2250   3000 sRGB       TRUE         0 300x300
5 PNG     2250   3000 sRGB       TRUE         0 300x300
6 PNG     2250   3000 sRGB       TRUE         0 300x300
7 PNG     2250   3000 sRGB       TRUE         0 300x300
8 PNG     2250   3000 sRGB       TRUE         0 300x300
9 PNG     2250   3000 sRGB       TRUE         0 300x300
Error in magick_image_subset(x, i) : subscript out of bounds
Called from: magick_image_subset(x, i)

我認為可能有兩種方法可以解決這個問題,但我還不知道如何去做:1. 使用try-catch , 2. 通過使用magick::image_read_pdf獲取總頁數替換max_page

提前感謝您的幫助。

如果您查看?image_read的文檔,我們可以看到:

所有標准的基本向量方法,例如 [、[[、c()、as.list()、as.raster()、rev()、length() 和 print(),都可以用於處理魔法圖像對象。 使用標准 img[i] 語法從圖像中提取幀的子集。

因此,您可以簡單地使用length(pages)來獲取該文檔的頁數。 這是使用lapply()的 function 的簡單版本。 我認為你可以簡化你的路徑很多,但不會進入那個。

library(magick)
library(glue)

pdf2plot <- function(file_path, file_names_no_ext){
  pages <- magick::image_read_pdf(file_path)
  lapply(
    1:length(pages),
    \(i) image_write(pages[i], path = paste0(glue(main_path, '/plot/', {file_names_no_ext},
                                                   sprintf('_%02d.', i)), format = "png"))
  )
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM