From 34d2c05f21f722c304fd0259988d724f9838086a Mon Sep 17 00:00:00 2001 From: Kilian Schuettler Date: Tue, 18 Feb 2025 23:50:49 +0100 Subject: [PATCH] start integration of pdf.js --- package.json | 1 + src-tauri/Cargo.lock | 1 + src-tauri/Cargo.toml | 1 + src-tauri/src/lib.rs | 6 ++- src/components/RenderedPageView.svelte | 4 -- src/models/Document.svelte.ts | 14 +++++ src/models/FileViewState.svelte.ts | 4 ++ src/models/PdfFile.ts | 1 + yarn.lock | 73 ++++++++++++++++++++++++++ 9 files changed, 100 insertions(+), 5 deletions(-) create mode 100644 src/models/Document.svelte.ts diff --git a/package.json b/package.json index 576b92f..ed8dd0b 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "flowbite-svelte-icons": "^2.0.2", "monaco-editor": "^0.52.2", "paths": "^0.1.1", + "pdfjs-dist": "^4.10.38", "svelte-split-pane": "^0.1.2", "svelte-splitpanes": "^8.0.9", "vite-plugin-monaco-editor": "^1.1.0" diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 531085a..01cf95d 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -3686,6 +3686,7 @@ dependencies = [ name = "pdf-forge" version = "0.1.0" dependencies = [ + "base64 0.21.7", "image 0.25.5", "indexmap 1.9.3", "lazy_static", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 86dbe40..1691bbf 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -22,6 +22,7 @@ tauri = { version = "2", features = [] } tauri-plugin-opener = "2" serde = { version = "1", features = ["derive"] } serde_json = "1" +base64 = "0.21" pdf = { path = "/home/kschuettler/rust/pdf-forge/src-pdfrs/pdf", features = ["cache", "dump"], default-features=false} tauri-plugin-fs = "2" tauri-plugin-dialog = "2" diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index ec4e98c..121d14e 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -18,9 +18,11 @@ use regex::Regex; use retrieval::{get_prim_by_path_with_file, get_stream_data_by_path_with_file}; use serde::{Deserialize, Serialize}; use std::collections::{HashMap, VecDeque}; +use std::fs; use std::ops::Deref; use std::path::Path; use std::sync::{Arc, RwLock}; +use base64::Engine; use tauri::ipc::{InvokeResponseBody, Response}; use tauri::{Manager, State}; use uuid::Uuid; @@ -47,6 +49,7 @@ pub struct PdfFile { pub page_count: u32, pub xref_entries: usize, pub pages: Vec, + pub bytes: String, } #[derive(Serialize, Debug, Clone)] @@ -203,7 +206,7 @@ fn to_pdf_file(path: &str, file: &CosFile) -> Result { page_num: (i + 1) as u64, }) .collect(); - + let bytes = base64::engine::general_purpose::STANDARD.encode(t!(fs::read(path))); let pdf_file = PdfFile { id: Uuid::new_v4().to_string(), name: file_name.to_string().into(), @@ -211,6 +214,7 @@ fn to_pdf_file(path: &str, file: &CosFile) -> Result { page_count: file.num_pages(), xref_entries: file.get_xref().len(), pages: pages, + bytes }; Ok(pdf_file) } diff --git a/src/components/RenderedPageView.svelte b/src/components/RenderedPageView.svelte index a350bef..6d4985a 100644 --- a/src/components/RenderedPageView.svelte +++ b/src/components/RenderedPageView.svelte @@ -21,10 +21,6 @@ .page-container { @apply w-full bg-forge-dark relative m-auto; } - .image-container { - @apply flex items-center justify-center h-full; - width: fit-content; - } .loading-container { @apply flex items-center justify-center h-full; } diff --git a/src/models/Document.svelte.ts b/src/models/Document.svelte.ts new file mode 100644 index 0000000..07cb037 --- /dev/null +++ b/src/models/Document.svelte.ts @@ -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() + } + +} \ No newline at end of file diff --git a/src/models/FileViewState.svelte.ts b/src/models/FileViewState.svelte.ts index c1da0b8..f62dd01 100644 --- a/src/models/FileViewState.svelte.ts +++ b/src/models/FileViewState.svelte.ts @@ -12,6 +12,7 @@ import {RawImageData} from "./RawImageData"; import TreeViewState from "./TreeViewState.svelte"; import {PageViewState} from "./PageViewState.svelte"; import PathHistory from "./PathHistory.svelte"; +import Document from "./Document.svelte.js"; export default class FileViewState { public pathHistory: PathHistory = new PathHistory(); @@ -40,6 +41,8 @@ export default class FileViewState { public changes: PrimitiveModel[] = $state([]); + public renderer: Document; + constructor(file: PdfFile) { @@ -48,6 +51,7 @@ export default class FileViewState { this.loadXrefEntries() this.notificationMutex = new Mutex(); this.treeState = new TreeViewState(this); + this.renderer = new Document(file.bytes) } getLastJump(): string | number | undefined { diff --git a/src/models/PdfFile.ts b/src/models/PdfFile.ts index a0013bf..9b55caf 100644 --- a/src/models/PdfFile.ts +++ b/src/models/PdfFile.ts @@ -8,4 +8,5 @@ export default interface PdfFile { readonly xref_entries: number; readonly last_modified: Date; readonly pages: PageModel[]; + readonly bytes: string; } diff --git a/yarn.lock b/yarn.lock index c919ee6..355c988 100644 --- a/yarn.lock +++ b/yarn.lock @@ -221,6 +221,72 @@ dependencies: 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": version "2.1.5" 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" 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: version "1.1.1" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz"