Fix some possible pdf thumb rendering concurrency bugs (#1809)

This commit is contained in:
Vítor Vasconcellos 2023-11-23 16:38:17 -03:00 committed by GitHub
parent b27686860d
commit 26a31ce15e
2 changed files with 21 additions and 24 deletions

View File

@ -27,8 +27,6 @@ pub enum Error {
RgbImageConversion,
#[error("error with pdfium: {0}")]
Pdfium(#[from] pdfium_render::prelude::PdfiumError),
#[error("failed to load pdfium library")]
PdfiumBinding,
#[error("error with usvg: {0}")]
USvg(#[from] resvg::usvg::Error),
#[error("failed to allocate `Pixbuf` while converting an SVG")]

View File

@ -4,7 +4,7 @@ use std::{
path::{Path, PathBuf},
};
use crate::{consts::PDF_RENDER_WIDTH, Error::PdfiumBinding, ImageHandler, Result};
use crate::{consts::PDF_RENDER_WIDTH, ImageHandler, Result};
use image::DynamicImage;
use once_cell::sync::Lazy;
use pdfium_render::prelude::{PdfPageRenderRotation, PdfRenderConfig, Pdfium};
@ -20,9 +20,9 @@ const BINDING_LOCATION: &str = if cfg!(target_os = "macos") {
"../lib/spacedrive"
};
static PDFIUM: Lazy<Option<Pdfium>> = Lazy::new(|| {
static PDFIUM_LIB: Lazy<String> = Lazy::new(|| {
let lib_name = Pdfium::pdfium_platform_library_name();
let lib_path = current_exe()
current_exe()
.ok()
.and_then(|exe_path| {
exe_path.parent().and_then(|parent_path| {
@ -46,33 +46,32 @@ static PDFIUM: Lazy<Option<Pdfium>> = Lazy::new(|| {
.to_str()
.expect("We are converting valid strs to PathBuf then back, it should not fail")
.to_owned()
});
Pdfium::bind_to_library(lib_path)
.or_else(|err| {
error!("{err:#?}");
Pdfium::bind_to_system_library()
})
.map(Pdfium::new)
.map_err(|err| error!("{err:#?}"))
.ok()
});
static PDFIUM_RENDER_CONFIG: Lazy<PdfRenderConfig> = Lazy::new(|| {
PdfRenderConfig::new()
.set_target_width(PDF_RENDER_WIDTH)
.rotate_if_landscape(PdfPageRenderRotation::Degrees90, true)
.render_form_data(false)
.render_annotations(false)
});
pub struct PdfHandler {}
impl ImageHandler for PdfHandler {
fn handle_image(&self, path: &Path) -> Result<DynamicImage> {
let pdfium = PDFIUM.as_ref().ok_or(PdfiumBinding)?;
let pdfium = Pdfium::new(Pdfium::bind_to_library(PDFIUM_LIB.as_str()).or_else(|err| {
error!("{err:#?}");
Pdfium::bind_to_system_library()
})?);
let render_config = PdfRenderConfig::new()
.set_target_width(PDF_RENDER_WIDTH)
.rotate_if_landscape(PdfPageRenderRotation::Degrees90, true);
let pdf = pdfium.load_pdf_from_file(path, None)?;
let first_page = pdf.pages().first()?;
let image = first_page
.render_with_config(&PDFIUM_RENDER_CONFIG)?
.as_image();
Ok(pdfium
.load_pdf_from_file(path, None)?
.pages()
.first()?
.render_with_config(&render_config)?
.as_image())
Ok(image)
}
}