mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
Add pdf preview with pdftotext
This commit is contained in:
parent
8e688291a4
commit
d4f6ed8ad6
4 changed files with 37 additions and 0 deletions
2
core/src/external/mod.rs
vendored
2
core/src/external/mod.rs
vendored
|
|
@ -5,6 +5,7 @@ mod file;
|
|||
mod fzf;
|
||||
mod jq;
|
||||
mod lsar;
|
||||
mod pdftotext;
|
||||
mod rg;
|
||||
mod unar;
|
||||
mod zoxide;
|
||||
|
|
@ -16,6 +17,7 @@ pub use file::*;
|
|||
pub use fzf::*;
|
||||
pub use jq::*;
|
||||
pub use lsar::*;
|
||||
pub use pdftotext::*;
|
||||
pub use rg::*;
|
||||
pub use unar::*;
|
||||
pub use zoxide::*;
|
||||
|
|
|
|||
19
core/src/external/pdftotext.rs
vendored
Normal file
19
core/src/external/pdftotext.rs
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
use std::path::Path;
|
||||
|
||||
use anyhow::{bail, Result};
|
||||
use tokio::process::Command;
|
||||
|
||||
pub async fn pdftotext(path: &Path) -> Result<String> {
|
||||
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())
|
||||
}
|
||||
|
|
@ -63,6 +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::Video => Self::video(&path).await,
|
||||
MimeKind::Archive => Self::archive(&path).await.map(PreviewData::Text),
|
||||
MimeKind::Others => Err(anyhow!("Unsupported mimetype: {}", mime)),
|
||||
|
|
@ -128,6 +129,17 @@ impl Preview {
|
|||
)
|
||||
}
|
||||
|
||||
pub async fn pdf(path: &Path) -> Result<String> {
|
||||
Ok(
|
||||
external::pdftotext(path)
|
||||
.await?
|
||||
.lines()
|
||||
.take(Self::rect().height as usize)
|
||||
.collect::<Vec<_>>()
|
||||
.join("\n"),
|
||||
)
|
||||
}
|
||||
|
||||
pub async fn archive(path: &Path) -> Result<String> {
|
||||
Ok(
|
||||
external::lsar(path)
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ pub enum MimeKind {
|
|||
Text,
|
||||
Image,
|
||||
Video,
|
||||
Pdf,
|
||||
Archive,
|
||||
Others,
|
||||
}
|
||||
|
|
@ -27,6 +28,7 @@ impl MimeKind {
|
|||
"message" => true,
|
||||
"model" => true,
|
||||
"multipart" => true,
|
||||
"pdf" => true,
|
||||
"text" => true,
|
||||
"video" => true,
|
||||
_ => false,
|
||||
|
|
@ -39,6 +41,8 @@ impl MimeKind {
|
|||
Self::Dir
|
||||
} else if s == "application/json" {
|
||||
Self::JSON
|
||||
} else if s == "application/pdf" {
|
||||
Self::Pdf
|
||||
} else if s.starts_with("text/") || s.ends_with("/xml") {
|
||||
Self::Text
|
||||
} else if s.starts_with("image/") {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue