start integration of pdf.js

This commit is contained in:
Kilian Schuettler 2025-02-18 23:50:49 +01:00
parent 4e9e01bf94
commit 34d2c05f21
9 changed files with 100 additions and 5 deletions

View File

@ -24,6 +24,7 @@
"flowbite-svelte-icons": "^2.0.2", "flowbite-svelte-icons": "^2.0.2",
"monaco-editor": "^0.52.2", "monaco-editor": "^0.52.2",
"paths": "^0.1.1", "paths": "^0.1.1",
"pdfjs-dist": "^4.10.38",
"svelte-split-pane": "^0.1.2", "svelte-split-pane": "^0.1.2",
"svelte-splitpanes": "^8.0.9", "svelte-splitpanes": "^8.0.9",
"vite-plugin-monaco-editor": "^1.1.0" "vite-plugin-monaco-editor": "^1.1.0"

1
src-tauri/Cargo.lock generated
View File

@ -3686,6 +3686,7 @@ dependencies = [
name = "pdf-forge" name = "pdf-forge"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"base64 0.21.7",
"image 0.25.5", "image 0.25.5",
"indexmap 1.9.3", "indexmap 1.9.3",
"lazy_static", "lazy_static",

View File

@ -22,6 +22,7 @@ tauri = { version = "2", features = [] }
tauri-plugin-opener = "2" tauri-plugin-opener = "2"
serde = { version = "1", features = ["derive"] } serde = { version = "1", features = ["derive"] }
serde_json = "1" serde_json = "1"
base64 = "0.21"
pdf = { path = "/home/kschuettler/rust/pdf-forge/src-pdfrs/pdf", features = ["cache", "dump"], default-features=false} pdf = { path = "/home/kschuettler/rust/pdf-forge/src-pdfrs/pdf", features = ["cache", "dump"], default-features=false}
tauri-plugin-fs = "2" tauri-plugin-fs = "2"
tauri-plugin-dialog = "2" tauri-plugin-dialog = "2"

View File

@ -18,9 +18,11 @@ use regex::Regex;
use retrieval::{get_prim_by_path_with_file, get_stream_data_by_path_with_file}; use retrieval::{get_prim_by_path_with_file, get_stream_data_by_path_with_file};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::collections::{HashMap, VecDeque}; use std::collections::{HashMap, VecDeque};
use std::fs;
use std::ops::Deref; use std::ops::Deref;
use std::path::Path; use std::path::Path;
use std::sync::{Arc, RwLock}; use std::sync::{Arc, RwLock};
use base64::Engine;
use tauri::ipc::{InvokeResponseBody, Response}; use tauri::ipc::{InvokeResponseBody, Response};
use tauri::{Manager, State}; use tauri::{Manager, State};
use uuid::Uuid; use uuid::Uuid;
@ -47,6 +49,7 @@ pub struct PdfFile {
pub page_count: u32, pub page_count: u32,
pub xref_entries: usize, pub xref_entries: usize,
pub pages: Vec<PageModel>, pub pages: Vec<PageModel>,
pub bytes: String,
} }
#[derive(Serialize, Debug, Clone)] #[derive(Serialize, Debug, Clone)]
@ -203,7 +206,7 @@ fn to_pdf_file(path: &str, file: &CosFile) -> Result<PdfFile, String> {
page_num: (i + 1) as u64, page_num: (i + 1) as u64,
}) })
.collect(); .collect();
let bytes = base64::engine::general_purpose::STANDARD.encode(t!(fs::read(path)));
let pdf_file = PdfFile { let pdf_file = PdfFile {
id: Uuid::new_v4().to_string(), id: Uuid::new_v4().to_string(),
name: file_name.to_string().into(), name: file_name.to_string().into(),
@ -211,6 +214,7 @@ fn to_pdf_file(path: &str, file: &CosFile) -> Result<PdfFile, String> {
page_count: file.num_pages(), page_count: file.num_pages(),
xref_entries: file.get_xref().len(), xref_entries: file.get_xref().len(),
pages: pages, pages: pages,
bytes
}; };
Ok(pdf_file) Ok(pdf_file)
} }

View File

@ -21,10 +21,6 @@
.page-container { .page-container {
@apply w-full bg-forge-dark relative m-auto; @apply w-full bg-forge-dark relative m-auto;
} }
.image-container {
@apply flex items-center justify-center h-full;
width: fit-content;
}
.loading-container { .loading-container {
@apply flex items-center justify-center h-full; @apply flex items-center justify-center h-full;
} }

View File

@ -0,0 +1,14 @@
import {fromBase64Util} from "pdfjs-dist/types/src/shared/util";
import {getDocument} from "pdfjs-dist";
export default class Document {
constructor(bytesB64: string) {
let bytes = fromBase64Util(bytesB64)
let loadingTask = getDocument({ data: bytes });
let doc = await loadingTask.promise
let dict: Dict = new Dict()
}
}

View File

@ -12,6 +12,7 @@ import {RawImageData} from "./RawImageData";
import TreeViewState from "./TreeViewState.svelte"; import TreeViewState from "./TreeViewState.svelte";
import {PageViewState} from "./PageViewState.svelte"; import {PageViewState} from "./PageViewState.svelte";
import PathHistory from "./PathHistory.svelte"; import PathHistory from "./PathHistory.svelte";
import Document from "./Document.svelte.js";
export default class FileViewState { export default class FileViewState {
public pathHistory: PathHistory = new PathHistory(); public pathHistory: PathHistory = new PathHistory();
@ -40,6 +41,8 @@ export default class FileViewState {
public changes: PrimitiveModel[] = $state([]); public changes: PrimitiveModel[] = $state([]);
public renderer: Document;
constructor(file: PdfFile) { constructor(file: PdfFile) {
@ -48,6 +51,7 @@ export default class FileViewState {
this.loadXrefEntries() this.loadXrefEntries()
this.notificationMutex = new Mutex(); this.notificationMutex = new Mutex();
this.treeState = new TreeViewState(this); this.treeState = new TreeViewState(this);
this.renderer = new Document(file.bytes)
} }
getLastJump(): string | number | undefined { getLastJump(): string | number | undefined {

View File

@ -8,4 +8,5 @@ export default interface PdfFile {
readonly xref_entries: number; readonly xref_entries: number;
readonly last_modified: Date; readonly last_modified: Date;
readonly pages: PageModel[]; readonly pages: PageModel[];
readonly bytes: string;
} }

View File

@ -221,6 +221,72 @@
dependencies: dependencies:
state-local "^1.0.6" state-local "^1.0.6"
"@napi-rs/canvas-android-arm64@0.1.67":
version "0.1.67"
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.67.tgz#7e1e4c9395c67af98d61c53a822f45697bc7272c"
integrity sha512-W+3DFG5h0WU8Vqqb3W5fNmm5/TPH5ECZRinQDK4CAKFSUkc4iZcDwrmyFG9sB4KdHazf1mFVHCpEeVMO6Mk6Zg==
"@napi-rs/canvas-darwin-arm64@0.1.67":
version "0.1.67"
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.67.tgz#a7aa4c12371bad46df90129042a76e7f6312e7f7"
integrity sha512-xzrv7QboI47yhIHR5P5u/9KGswokuOKLiKSukr1Ku03RRJxP6lGuVtrAZAgdRg7F9FsuF2REf2yK53YVb6pMlA==
"@napi-rs/canvas-darwin-x64@0.1.67":
version "0.1.67"
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.67.tgz#00a57ecbd868cc499b09806166ed4805ec73868c"
integrity sha512-SNk9lYBr84N0gW8MZ2IrjygFtbFBILr3SEqMdHzHHuph20SQmssFvJGPZwSSCMEyKAvyqhogbmlew0te5Z4w9Q==
"@napi-rs/canvas-linux-arm-gnueabihf@0.1.67":
version "0.1.67"
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.67.tgz#3be76f08a0ee4b35842b0f1d7f88d1bdbb7ef8c3"
integrity sha512-qmBlSvUpl567bzH8tNXi82u5FrL4d0qINqd6K9O7GWGGGFmKMJdrgi2/SW3wwCTxqHBasIDdVWc4KSJfwyaoDQ==
"@napi-rs/canvas-linux-arm64-gnu@0.1.67":
version "0.1.67"
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.67.tgz#bdcfcd8f7cd50c3c7d6da681da37657d0f313757"
integrity sha512-k3nAPQefkMeFuJ65Rqdnx92KX1JXQhEKjjWeKsCJB+7sIBgQUWtHo9c3etfVLv5pkWJJDFi/Zc2soNkH3E8dRA==
"@napi-rs/canvas-linux-arm64-musl@0.1.67":
version "0.1.67"
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.67.tgz#64517c4562e95ebf8e7dfbbfbf3608e39d45e9bb"
integrity sha512-lZwHWR1cCP408l86n3Qbs3X1oFeAYMjJIQvQl1VMZh6wo5PfI+jaZSKBUOd8x44TnVllX9yhLY9unNRztk/sUQ==
"@napi-rs/canvas-linux-riscv64-gnu@0.1.67":
version "0.1.67"
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.67.tgz#382d231c7fbef121936dad4adc0b00fe54db8b48"
integrity sha512-PdBC9p6bLHA1W3OdA0vTHj701SB/kioGQ1uCFBRMs5KBCaMLb/H4aNi8uaIUIEvBWnxeAjoNcLU7//q0FxEosw==
"@napi-rs/canvas-linux-x64-gnu@0.1.67":
version "0.1.67"
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.67.tgz#267c033c70367226923ab3b5c53d38ea3113a9c3"
integrity sha512-kJJX6eWzjipL/LdKOWCJctc88e5yzuXri8+s0V/lN06OwuLGW62TWS3lvi8qlUrGMOfRGabSWWlB4omhASSB8w==
"@napi-rs/canvas-linux-x64-musl@0.1.67":
version "0.1.67"
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.67.tgz#b4cbdb998b63d2b8ae9bcd3894309d92cbc24db7"
integrity sha512-jLKiPWGeN6ZzhnaLG7ex7eexsiHJ1mdtPK1qKvETIcu45dApMXyUIHvdL6XWB5gFFtj5ScHzLUxv1vkfPZsoxA==
"@napi-rs/canvas-win32-x64-msvc@0.1.67":
version "0.1.67"
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.67.tgz#ee608ad9fe751c897c2ad8a1d81798732753ab41"
integrity sha512-K/JmkOFbc4iRZYUqJhj0jwqfHA/wNQEmTiGNsgZ6d59yF/IBNp5T0D5eg3B8ghjI8GxDYCiSJ6DNX8mC3Oh2EQ==
"@napi-rs/canvas@^0.1.65":
version "0.1.67"
resolved "https://registry.yarnpkg.com/@napi-rs/canvas/-/canvas-0.1.67.tgz#8b6993910d7865ddcab0e6d9b1b199707d3945b7"
integrity sha512-VA4Khm/5Kg2bQGx3jXotTC4MloOG8b1Ung80exafUK0k5u6yJmIz3Q2iXeeWZs5weV+LQOEB+CPKsYwEYaGAjw==
optionalDependencies:
"@napi-rs/canvas-android-arm64" "0.1.67"
"@napi-rs/canvas-darwin-arm64" "0.1.67"
"@napi-rs/canvas-darwin-x64" "0.1.67"
"@napi-rs/canvas-linux-arm-gnueabihf" "0.1.67"
"@napi-rs/canvas-linux-arm64-gnu" "0.1.67"
"@napi-rs/canvas-linux-arm64-musl" "0.1.67"
"@napi-rs/canvas-linux-riscv64-gnu" "0.1.67"
"@napi-rs/canvas-linux-x64-gnu" "0.1.67"
"@napi-rs/canvas-linux-x64-musl" "0.1.67"
"@napi-rs/canvas-win32-x64-msvc" "0.1.67"
"@nodelib/fs.scandir@2.1.5": "@nodelib/fs.scandir@2.1.5":
version "2.1.5" version "2.1.5"
resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz"
@ -1218,6 +1284,13 @@ paths@^0.1.1:
resolved "https://registry.npmjs.org/paths/-/paths-0.1.1.tgz" resolved "https://registry.npmjs.org/paths/-/paths-0.1.1.tgz"
integrity sha512-MO2qBeKTXfH+qlZjo2+R5GmjCo/1r9CIWwtA7JUzafClhzWH9x/nDrJiaTXsWekNrHMlbSSI+Mc4654INuvbrQ== integrity sha512-MO2qBeKTXfH+qlZjo2+R5GmjCo/1r9CIWwtA7JUzafClhzWH9x/nDrJiaTXsWekNrHMlbSSI+Mc4654INuvbrQ==
pdfjs-dist@^4.10.38:
version "4.10.38"
resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-4.10.38.tgz#3ee698003790dc266cc8b55c0e662ccb9ae18f53"
integrity sha512-/Y3fcFrXEAsMjJXeL9J8+ZG9U01LbuWaYypvDW2ycW1jL269L3js3DVBjDJ0Up9Np1uqDXsDrRihHANhZOlwdQ==
optionalDependencies:
"@napi-rs/canvas" "^0.1.65"
picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.1: picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.1:
version "1.1.1" version "1.1.1"
resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz"