From a8f2cd4e9e1249525e1f71e18dc4b18cd958c6d4 Mon Sep 17 00:00:00 2001 From: C4illin Date: Thu, 30 May 2024 12:06:02 +0200 Subject: [PATCH] feat: poppler working for some formats --- bun.lockb | Bin 97629 -> 98710 bytes package.json | 3 +- src/converters/main.ts | 6 ++ src/converters/poppler.ts | 115 +++++++++++++++++++++++++++++++ src/helpers/normalizeFiletype.ts | 2 + 5 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 src/converters/poppler.ts diff --git a/bun.lockb b/bun.lockb index 308e056e2dc4dbd6e3094888f29c8472a55ff9ef..7be2df7bbc6794e35b0f647c2568b661c478ee01 100755 GIT binary patch delta 17523 zcmeI3d3aP+*6!;ZC`bVX1VTtE14#%o2?!*_HOaf!|PI}gw$H7 zIjl!pJtn%`cf}_5XRyQJ8%J?HWLZ&GX&%`nIn!q56gwQd$aj&SQ!u9_Kg;0=gV%wd z(;W^s@c>q-fr7fu)$e=DH`TI-&n_t` zol}(Kn3GjJxdb(a2HE*@l2Z#s*>pc|hfbo#48IIPHif&8b&(yYC&R`d8z6H^va<@Z zCgo%o4%{3*^@)KQF5!A-5oF za-83u$7m#W1?=4d7e%(vhAw?C(n$QehJ5M2s5qyzG(V?Ur+p|qhj9u^%N>qWs4D|M z<(GMl?2Zd^W?GhyhfBHPm!pwl!K9p=qJ;bs$9~$0r8|(4KPJTHN0HL*VWb#vFXf`p zOk@jW9$H^gA_Y&P<%+*bbNWc(b&;G-r~d6BX^bDl5$| zC~@SJ%qYt#p5u7KV>iqx!FebWL%qf{92sF-nw34hSX>lBzF0Op($1Fvz-T-)v1~Hs z(r1&o2+j(tl z+l!H6!&mL>E+!UdW#{1U{PuSKKBPpSmY{|>TbA!iu&V`PYEpi&6@1Sp1~f>>%`eDt z6eZ-$%qc8&Eb3tA_d&|=S;fWTdBT^BqCrEZ;ZDwx|AOQIuP* znn(vF1z9B$1K)PEJ6=dbrqg$bJdqex?M&}leds@$S08!9tKjvC@`yDxO92EyTj2E zc|THAS&EeUt9#h>Z-x{3zRo@Eq2rMa;YX38vVTV_|FR8Iavh-`6Z=}Ti~)TZW(CD`3*?%SQ=6m zUd#M-A_`dce#Puir8sau<;DtkM*XAO{wZoBN$W){(pk_!3yC9@k_~l@`yb3Ah zw|?}=*Gm@9J$f)T;?Msu=lS~G`T4U$%0}PVWblVKyVu13{Z8ka)-}(iojZ4^C}@oH z&}sMcx-(zn?WV?g(p(2g5sp4xRR*WHF2M*oUu{(#p5khuI~+`dua=4pPtkAHRYgOu z{*A7x5J@$ZC)lf()KHm-Cu*pQV6Ur5O@{;Pd`{_1�+9jlBBunkp0Va!pl%XyQ~= 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 R7GZAbtA!p8o2d1V_#Z>O4)Op1 delta 17291 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 diff --git a/package.json b/package.json index 0cdc010..be0d7d9 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ "@elysiajs/html": "^1.0.2", "@elysiajs/jwt": "^1.0.2", "@elysiajs/static": "^1.0.3", - "elysia": "^1.0.22" + "elysia": "^1.0.22", + "node-poppler": "^7.2.0" }, "module": "src/index.tsx", "bun-create": { diff --git a/src/converters/main.ts b/src/converters/main.ts index 0807b97..3b60964 100644 --- a/src/converters/main.ts +++ b/src/converters/main.ts @@ -20,6 +20,8 @@ import { properties as propertiesPdflatex, } from "./pdflatex"; +import { convert as convertPoppler, properties as propertiesPoppler } from "./poppler"; + import { normalizeFiletype } from "../helpers/normalizeFiletype"; // This should probably be reconstructed so that the functions are not imported instead the functions hook into this to make the converters more modular @@ -58,6 +60,10 @@ const properties: { properties: propertiesPdflatex, converter: convertPdflatex, }, + poppler: { + properties: propertiesPoppler, + converter: convertPoppler, + }, pandoc: { properties: propertiesPandoc, converter: convertPandoc, diff --git a/src/converters/poppler.ts b/src/converters/poppler.ts new file mode 100644 index 0000000..f6404fe --- /dev/null +++ b/src/converters/poppler.ts @@ -0,0 +1,115 @@ +const { Poppler } = require("node-poppler"); +const poppler = new Poppler(); + +export const properties = { + from: { + text: ["pdf"], + }, + to: { + text: [ + "jpeg", + "png", + "tiff", + "eps", + "icc", + "pdf", + "svg", + "ps", + "html", + "text", + ], + }, +}; + +export function convert( + filePath: string, + fileType: string, + convertTo: string, + targetPath: string, + // biome-ignore lint/suspicious/noExplicitAny: + options?: any, +): Promise { + return new Promise((resolve, reject) => { + const cairoFiles = [ + "jpeg", + "png", + "tiff", + "eps", + "icc", + "pdf", + "svg", + "ps", + ]; + + if (cairoFiles.includes(convertTo)) { + const popplerOptions: { + jpegFile?: boolean; + pngFile?: boolean; + tiffFile?: boolean; + epsFile?: boolean; + iccFile?: boolean; + pdfFile?: boolean; + svgFile?: boolean; + psFile?: boolean; + } = {}; + + switch (convertTo) { + case "jpeg": + popplerOptions.jpegFile = true; + break; + case "png": + popplerOptions.pngFile = true; + break; + case "tiff": + popplerOptions.tiffFile = true; + break; + case "eps": + popplerOptions.epsFile = true; + break; + case "icc": + popplerOptions.iccFile = true; + break; + case "pdf": + popplerOptions.pdfFile = true; + break; + case "svg": + popplerOptions.svgFile = true; + break; + case "ps": + popplerOptions.psFile = true; + break; + default: + reject(`Invalid convertTo option: ${convertTo}`); + } + + poppler + .pdfToCairo(filePath, targetPath, popplerOptions) + .then(() => { + resolve("success"); + }) + .catch((err: Error) => { + reject(err); + }); + } else if (convertTo === "html") { + poppler + .pdfToHtml(filePath, targetPath) + .then(() => { + resolve("success"); + }) + .catch((err: Error) => { + reject(err); + }); + } else if (convertTo === "text") { + poppler + .pdfToText(filePath, targetPath) + .then(() => { + resolve("success"); + }) + .catch((err: Error) => { + reject(err); + }); + } else { + reject(`Invalid convertTo option: ${convertTo}`); + } + }); +} diff --git a/src/helpers/normalizeFiletype.ts b/src/helpers/normalizeFiletype.ts index 9b4cc1d..279e64d 100644 --- a/src/helpers/normalizeFiletype.ts +++ b/src/helpers/normalizeFiletype.ts @@ -25,6 +25,8 @@ export const normalizeOutputFiletype = (filetype: string): string => { return "tex"; case "markdown": return "md"; + case "text": + return "txt"; default: return lowercaseFiletype; }