From f177c449e46e78ceee6985f93bb4853ef6862beb Mon Sep 17 00:00:00 2001 From: Yifan Song Date: Thu, 3 Aug 2023 20:32:01 +0800 Subject: [PATCH] add pdf to ppm and remove pdf to text --- core/src/external/mod.rs | 4 ++-- core/src/external/pdftoppm.rs | 22 ++++++++++++++++++++++ core/src/external/pdftotext.rs | 19 ------------------- core/src/manager/preview.rs | 26 ++++++++++++++------------ 4 files changed, 38 insertions(+), 33 deletions(-) create mode 100644 core/src/external/pdftoppm.rs delete mode 100644 core/src/external/pdftotext.rs diff --git a/core/src/external/mod.rs b/core/src/external/mod.rs index 2b69b019..5312e70c 100644 --- a/core/src/external/mod.rs +++ b/core/src/external/mod.rs @@ -5,7 +5,7 @@ mod file; mod fzf; mod jq; mod lsar; -mod pdftotext; +mod pdftoppm; mod rg; mod unar; mod zoxide; @@ -17,7 +17,7 @@ pub use file::*; pub use fzf::*; pub use jq::*; pub use lsar::*; -pub use pdftotext::*; +pub use pdftoppm::*; pub use rg::*; pub use unar::*; pub use zoxide::*; diff --git a/core/src/external/pdftoppm.rs b/core/src/external/pdftoppm.rs new file mode 100644 index 00000000..ba92a415 --- /dev/null +++ b/core/src/external/pdftoppm.rs @@ -0,0 +1,22 @@ +use std::path::Path; + +use anyhow::{bail, Result}; +use tokio::process::Command; + +pub async fn pdftoppm(path: &Path, dest: &Path) -> Result<()> { + let output = Command::new("pdftoppm") + .args(["-png", "-singlefile"]) + .arg(path) + .arg(dest) + .kill_on_drop(true) + .output() + .await?; + + if !output.status.success() { + bail!( + "failed to get pdf: {}", + String::from_utf8_lossy(&output.stderr) + ); + } + Ok(()) +} diff --git a/core/src/external/pdftotext.rs b/core/src/external/pdftotext.rs deleted file mode 100644 index ae38ac0d..00000000 --- a/core/src/external/pdftotext.rs +++ /dev/null @@ -1,19 +0,0 @@ -use std::path::Path; - -use anyhow::{bail, Result}; -use tokio::process::Command; - -pub async fn pdftotext(path: &Path) -> Result { - let output = Command::new("pdftotext") - .args(["-l", "10", "-nopgbrk", "-q", "--"]) - .arg(path) - .arg("-") - .kill_on_drop(true) - .output() - .await?; - - if !output.status.success() { - bail!("failed to get json: {}", String::from_utf8_lossy(&output.stderr)); - } - Ok(String::from_utf8_lossy(&output.stdout).trim().to_string()) -} diff --git a/core/src/manager/preview.rs b/core/src/manager/preview.rs index 4334fd06..f9a4f833 100644 --- a/core/src/manager/preview.rs +++ b/core/src/manager/preview.rs @@ -63,7 +63,7 @@ impl Preview { MimeKind::JSON => Self::json(&path).await.map(PreviewData::Text), MimeKind::Text => Self::highlight(&path).await.map(PreviewData::Text), MimeKind::Image => Self::image(&path).await, - MimeKind::Pdf => Self::pdf(&path).await.map(PreviewData::Text), + MimeKind::Pdf => Self::pdf(&path).await, MimeKind::Video => Self::video(&path).await, MimeKind::Archive => Self::archive(&path).await.map(PreviewData::Text), MimeKind::Others => Err(anyhow!("Unsupported mimetype: {}", mime)), @@ -118,6 +118,19 @@ impl Preview { Self::image(&cache).await } + pub async fn pdf(path: &Path) -> Result { + let cache = Image::cache(path); + if fs::metadata(&cache).await.is_err() { + external::pdftoppm(path, &cache).await?; + } + + let mut dest = cache.into_os_string(); + dest.push(".png"); + + let dest = Path::new(&dest); + Self::image(dest).await + } + pub async fn json(path: &Path) -> Result { Ok( external::jq(path) @@ -129,17 +142,6 @@ impl Preview { ) } - pub async fn pdf(path: &Path) -> Result { - Ok( - external::pdftotext(path) - .await? - .lines() - .take(Self::rect().height as usize) - .collect::>() - .join("\n"), - ) - } - pub async fn archive(path: &Path) -> Result { Ok( external::lsar(path)