Skip to content

Latest commit

ย 

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

sc_anydoc

English README

firecrawl/anydoc ์„ Windows DLL(C ABI) ๋กœ ๊ฐ์‹ธ๊ณ , Delphi ์—์„œ ๋ฐ”๋กœ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“  ๋ž˜ํผ.

Word / PowerPoint / Excel / OpenDocument / RTF / EPUB / CSV / PDF ๋ฅผ GitHub Flavored Markdown ์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.


anydoc ์ด๋ž€

Firecrawl ์ด Rust ๋กœ ๋งŒ๋“  ๋ฌธ์„œ ๋ณ€ํ™˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค. MIT ๋ผ์ด์„ ์Šค.

๋ฌธ์„œ ๋ฐ”์ดํŠธ โ†’ ํฌ๋งท ๊ฐ์ง€ โ†’ ํฌ๋งท๋ณ„ ํŒŒ์„œ โ†’ ๊ณต์šฉ ๋ฌธ์„œ ๋ชจ๋ธ โ†’ GFM ์‹œ๋ฆฌ์–ผ๋ผ์ด์ € โ†’ ๋งˆํฌ๋‹ค์šด

ํฌ๋งท๋งˆ๋‹ค ํŒŒ์„œ๊ฐ€ ๋”ฐ๋กœ ์žˆ์ง€๋งŒ ๋ชจ๋‘ ํ•˜๋‚˜์˜ ๊ณต์šฉ ๋ฌธ์„œ ๋ชจ๋ธ๋กœ ์ˆ˜๋ ดํ•œ ๋’ค ๋‹จ์ผ ์‹œ๋ฆฌ์–ผ๋ผ์ด์ €๋ฅผ ๊ฑฐ์นœ๋‹ค. ๊ทธ๋ž˜์„œ ์–ด๋–ค ํฌ๋งท์„ ๋„ฃ๋“  ์ถœ๋ ฅ ๋งˆํฌ๋‹ค์šด์˜ ์Šคํƒ€์ผ์ด ์ผ๊ด€๋œ๋‹ค.

ํŠน์ง• ๋‚ด์šฉ
์ง€์› ํฌ๋งท doc/docx/docm, ppt/pptx/pptm, xls/xlsx/xlsm/xlsb, odt/ods/odp, rtf, epub, csv, pdf
ํฌ๋งท ๊ฐ์ง€ ํŒŒ์ผ ๋‚ด์šฉ์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋กœ ํŒ๋ณ„ํ•œ๋‹ค. ํ™•์žฅ์ž์— ์˜์กดํ•˜์ง€ ์•Š์•„ ํ™•์žฅ์ž๊ฐ€ ํ‹€๋ ค๋„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋œ๋‹ค
๋ณด์กด ๋ฒ”์œ„ ์ œ๋ชฉ, ๊ตต๊ฒŒ/๊ธฐ์šธ์ž„, ๋งํฌ, ํ‘œ, ๊ฐ์ฃผ, ๋ชฉ๋ก
์†๋„ ์—…์ŠคํŠธ๋ฆผ ๊ธฐ์ค€ ๋ฌธ์„œ๋‹น ๋ณ€ํ™˜ ์ค‘์•™๊ฐ’ 5ms ๋ฏธ๋งŒ
์™ธ๋ถ€ ์˜์กด ์—†์Œ. ์ˆœ์ˆ˜ Rust ํฌ๋ ˆ์ดํŠธ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค

Office ์„ค์น˜๊ฐ€ ํ•„์š” ์—†๋‹ค. COM ์ž๋™ํ™”๋„, ๋ฐฑ๊ทธ๋ผ์šด๋“œ Word ํ”„๋กœ์„ธ์Šค๋„ ์—†์ด ๋ฐ”์ดํŠธ๋ฅผ ์ง์ ‘ ํŒŒ์‹ฑํ•œ๋‹ค.


์™œ ์ด ๋ž˜ํผ๋ฅผ ๋งŒ๋“ค์—ˆ๋‚˜

anydoc ์€ Node.js / Python / WebAssembly ๋ฐ”์ธ๋”ฉ์€ ์ œ๊ณตํ•˜์ง€๋งŒ C ABI ๋ฐ”์ธ๋”ฉ์ด ์—†๋‹ค. Delphi ๋ฅผ ๋น„๋กฏํ•œ ๋„ค์ดํ‹ฐ๋ธŒ ์–ธ์–ด์—์„œ ๋ถ€๋ฅผ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š” ๋œป์ด๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ทธ ๋นˆ์ž๋ฆฌ๋ฅผ ๋ฉ”์šด๋‹ค.

Windows ๋ฐ์Šคํฌํ†ฑ ์•ฑ์—์„œ ๋ฌธ์„œ๋ฅผ ํ…์ŠคํŠธ๋กœ ๋ฝ‘์•„๋‚ด๋ ค๋ฉด ๋ณดํ†ต ์ด๋Ÿฐ ์„ ํƒ์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, ๊ฐ๊ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

๋ฐฉ์‹ ๋ฌธ์ œ
MS Office COM ์ž๋™ํ™” Office ๋ผ์ด์„ ์Šค์™€ ์„ค์น˜๊ฐ€ ํ•„์š”ํ•˜๊ณ , ์„œ๋ฒ„/๋ฌด์ธ ํ™˜๊ฒฝ์—์„œ ๋ถˆ์•ˆ์ •ํ•˜๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‚จ๊ฑฐ๋‚˜ ๋ชจ๋‹ฌ ๋Œ€ํ™”์ƒ์ž์— ๊ฑธ๋ฆฐ๋‹ค
์™ธ๋ถ€ CLI ํ”„๋กœ์„ธ์Šค ํ˜ธ์ถœ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ ๋น„์šฉ, ์ž„์‹œ ํŒŒ์ผ ๊ด€๋ฆฌ, ํ‘œ์ค€์ถœ๋ ฅ ์ธ์ฝ”๋”ฉ ๋ฌธ์ œ๊ฐ€ ๋”ฐ๋ผ๋ถ™๋Š”๋‹ค
ํฌ๋งท๋ณ„ ํŒŒ์„œ ์ง์ ‘ ๊ตฌํ˜„ docx/xlsx/pptx/pdf ๋ฅผ ๊ฐ๊ฐ ๊ฐ๋‹นํ•ด์•ผ ํ•œ๋‹ค. ํ˜„์‹ค์ ์ด์ง€ ์•Š๋‹ค

anydoc ์€ ์ด๋ฏธ ์ด ๋ฌธ์ œ๋ฅผ ์ž˜ ํ‘ผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ณ , Rust ๋ผ cdylib ๋กœ ๋นŒ๋“œํ•˜๋ฉด ๊ทธ๋Œ€๋กœ DLL ์ด ๋œ๋‹ค. ์–‡์€ C ABI ๊ณ„์ธต๋งŒ ์–น์œผ๋ฉด Delphi ์—์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ•œ ๋ฒˆ์œผ๋กœ ๋๋‚œ๋‹ค. ์™ธ๋ถ€ ํ”„๋กœ์„ธ์Šค๋„, ์ž„์‹œ ํŒŒ์ผ๋„, Office ์„ค์น˜๋„ ํ•„์š” ์—†๋‹ค.

์„ค๊ณ„ํ•  ๋•Œ ์ง€ํ‚จ ๊ฒƒ

์—…์ŠคํŠธ๋ฆผ์„ ํฌํฌํ•˜์ง€ ์•Š๋Š”๋‹ค. anydoc ์€ ํ™œ๋ฐœํžˆ ์—…๋ฐ์ดํŠธ๋˜๋Š” ํ”„๋กœ์ ํŠธ๋‹ค. ํฌํฌํ•˜๊ฑฐ๋‚˜ ์†Œ์Šค๋ฅผ ๋ฒค๋”๋งํ•˜๋ฉด ์—…์ŠคํŠธ๋ฆผ์„ ๋”ฐ๋ผ๊ฐ€๋Š” ์ผ์ด ๊ณง ์œ ์ง€๋ณด์ˆ˜ ๋ถ€๋‹ด์ด ๋œ๋‹ค. ๊ทธ๋ž˜์„œ crates.io ์˜ ํฌ๋ ˆ์ดํŠธ๋ฅผ ์˜์กด์„ฑ์œผ๋กœ๋งŒ ์ฐธ์กฐํ•œ๋‹ค. ์ƒˆ ๋ฒ„์ „ ๋ฐ˜์˜์ด cargo update ํ•œ ์ค„๋กœ ๋๋‚œ๋‹ค.

์—…์ŠคํŠธ๋ฆผ์ด ๋ฐ”๋€Œ์–ด๋„ ๋ž˜ํผ๊ฐ€ ๊นจ์ง€์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค. ์•„๋ž˜ ๋„ค ๊ฐ€์ง€๋ฅผ ๋ฏธ๋ฆฌ ์ฒ˜๋ฆฌํ•ด ๋’€๋‹ค.

์œ„ํ—˜ ๋Œ€์‘
ํฌ๋งท enum ์— ํ•ญ๋ชฉ ์ถ”๊ฐ€ยท์ˆœ์„œ ๋ณ€๊ฒฝ ํฌ๋งท์„ ์„œ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฌธ์ž์—ด๋กœ ์ฃผ๊ณ ๋ฐ›๋Š”๋‹ค. ์ƒˆ ํฌ๋งท์ด ์ž๋™์œผ๋กœ ๋…ธ์ถœ๋œ๋‹ค
ConvertError ์— variant ์ถ”๊ฐ€ ์—…์ŠคํŠธ๋ฆผ์ด #[non_exhaustive] ๋กœ ์„ ์–ธํ–ˆ๋‹ค. ์™€์ผ๋“œ์นด๋“œ arm ์ด ์ƒํƒœ์ฝ”๋“œ 99 ๋กœ ํ˜๋ ค ์ปดํŒŒ์ผ์ด ๊นจ์ง€์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค. ๋ฉ”์‹œ์ง€๋Š” ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ๋˜์–ด ์ •๋ณด ์†์‹ค๋„ ์—†๋‹ค
ํฌ๋งท ํ•ด์„ ๊ทœ์น™ ๋ณ€๊ฒฝ ์—…์ŠคํŠธ๋ฆผ to_markdown() ๊ณผ ๊ฐ™์€ ์ˆœ์„œ(๋‚ด์šฉ ๊ฐ์ง€ โ†’ ํ™•์žฅ์ž ํด๋ฐฑ)๋ฅผ ๋”ฐ๋ฅธ๋‹ค
์–ด๋–ค ์ฝ”์–ด๊ฐ€ ๋“ค์–ด์žˆ๋Š”์ง€ ๋ชจ๋ฆ„ build.rs ๊ฐ€ Cargo.lock ์—์„œ ์ฝ์–ด DLL ์— ์ƒˆ๊ธด๋‹ค. ๋Ÿฐํƒ€์ž„์— CoreVersion ์œผ๋กœ ํ™•์ธ๋œ๋‹ค

32๋น„ํŠธ๋„ ๊ฐ™์ด ์ง€์›ํ•œ๋‹ค. ํ™•์ธํ•ด ๋ณด๋‹ˆ extern "C" export ์ด๋ฆ„์— 32๋น„ํŠธ์—์„œ๋„ ๋ฐ์ฝ”๋ ˆ์ด์…˜์ด ๋ถ™์ง€ ์•Š์•„, Delphi ์„ ์–ธ ํ•œ ๋ฒŒ๋กœ Win32/Win64 ๋ฅผ ๋ชจ๋‘ ์ปค๋ฒ„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. NativeUInt ๋„ Rust usize ์™€ ์ž๋™์œผ๋กœ ํญ์ด ๋งž๋Š”๋‹ค.


์š”๊ตฌ ์‚ฌํ•ญ

๋„๊ตฌ ๋ฒ„์ „ ๋น„๊ณ 
Rust 1.88 ์ด์ƒ anydoc ์ฝ”์–ด ์š”๊ตฌ์‚ฌํ•ญ (๊ฒ€์ฆ ํ™˜๊ฒฝ: 1.97.1)
ํƒ€๊นƒ x86_64-pc-windows-msvc, i686-pc-windows-msvc rustup target add <triple>
MSVC ๋นŒ๋“œ ๋„๊ตฌ Visual Studio Build Tools ๋ง์ปค(link.exe) ์šฉ
Delphi 13 (Studio 37.0) ๋ธํŒŒ์ด ๋ฐ”์ธ๋”ฉยท๋ฐ๋ชจ๋ฅผ ์“ธ ๋•Œ๋งŒ

DLL ๋นŒ๋“œ

.\build_anydoc.ps1                  # Win64
.\build_anydoc.ps1 -Platform Win32
.\build_anydoc.ps1 -Platform All    # ์–‘์ชฝ ์ˆœ์ฐจ ๋นŒ๋“œ

๋นŒ๋“œ โ†’ ABI ๊ฒ€์ฆ โ†’ ๋ฐฐํฌ ์ˆœ์œผ๋กœ ์ง„ํ–‰ํ•˜๋ฉฐ, ๊ฒ€์ฆ์— ์‹คํŒจํ•˜๋ฉด ๊ธฐ์กด DLL ์„ ๋ฎ์–ด์“ฐ์ง€ ์•Š๊ณ  ๋ฉˆ์ถ˜๋‹ค.

์˜ต์…˜ ์„ค๋ช…
-Platform Win64|Win32|All ๋Œ€์ƒ ํ”Œ๋žซํผ (๊ธฐ๋ณธ Win64)
-DeployRoot <๊ฒฝ๋กœ> ๋ฐฐํฌ ๋ฃจํŠธ (๊ธฐ๋ณธ C:\Works\lib\dll)
-SkipDeploy ๋นŒ๋“œ๋งŒ ํ•˜๊ณ  ๋ฐฐํฌํ•˜์ง€ ์•Š์Œ
-SkipVerify ๊ฒ€์ฆ ์ƒ๋žต

๋ฐฐํฌ ์œ„์น˜

64๋น„ํŠธ : C:\Works\lib\dll\sc_anydoc.dll
32๋น„ํŠธ : C:\Works\lib\dll\win32\sc_anydoc.dll     โ† ๋™์ผ๋ช…, ์ ‘๋ฏธ์–ด ์—†์Œ

32๋น„ํŠธ ํ”„๋กœ์„ธ์Šค๋Š” 64๋น„ํŠธ DLL ์„ ๋กœ๋“œํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ํด๋”๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค. ์ด๋ฆ„์ด ๊ฐ™์•„ Delphi ์„ ์–ธ์„ ํ”Œ๋žซํผ๋ณ„๋กœ ๋‚˜๋ˆŒ ํ•„์š”๊ฐ€ ์—†๋‹ค.

๋นŒ๋“œ ๊ฒฐ๊ณผ

Win64 Win32
DLL ํฌ๊ธฐ 7.7 MB 6.3 MB
์˜์กด DLL kernel32 / ntdll / bcryptprimitives / api-ms-win-core-synch ๋™์ผ

VC++ ์žฌ๋ฐฐํฌ ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š” ์—†๋‹ค. .cargo\config.toml ์— CRT ์ •์  ๋งํฌ(+crt-static)๋ฅผ ๊ณ ์ •ํ•ด ๋‘์–ด VCRUNTIME140.dll ๊ณผ UCRT ์˜์กด์ด ์‚ฌ๋ผ์ง„๋‹ค. DLL ํŒŒ์ผ ํ•˜๋‚˜๋งŒ ๋ณต์‚ฌํ•˜๋ฉด ๋์ด๋‹ค.

๊ฒ€์ฆ๋งŒ ๋”ฐ๋กœ ์‹คํ–‰

.\verify_dll.ps1 -Platform Win64
.\verify_dll.ps1 -Platform Win32   # 32๋น„ํŠธ PowerShell ๋กœ ์ž๋™ ์žฌ์‹คํ–‰๋œ๋‹ค

ํฌ์ธํ„ฐ ํญ, ํฌ๋งท ๊ฐ์ง€, ํ•œ๊ธ€ UTF-8 ์™•๋ณต, ํ™•์žฅ์ž ํžŒํŠธ ํด๋ฐฑ, ์˜ค๋ฅ˜ ๊ฒฝ๋กœ, ๋ฐ˜๋ณต ๋ณ€ํ™˜/ํ•ด์ œ 300ํšŒ๋ฅผ ํ™•์ธํ•œ๋‹ค.


์—…์ŠคํŠธ๋ฆผ ๋ฐ˜์˜

.\update_upstream.ps1          # ์ตœ์‹  ๋ฒ„์ „ ํ™•์ธ๋งŒ (์•„๋ฌด๊ฒƒ๋„ ๋ฐ”๊พธ์ง€ ์•Š์Œ)
.\update_upstream.ps1 -Apply   # cargo update + 32/64 ์žฌ๋นŒ๋“œ + ๊ฒ€์ฆ + ๋ฐฐํฌ

์—…์ŠคํŠธ๋ฆผ์ด 0.2.x ์ฒ˜๋Ÿผ Cargo.toml ์˜ ํ—ˆ์šฉ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ์ž๋™ ๋ฐ˜์˜์„ ๊ฑฐ๋ถ€ํ•˜๊ณ  ์•ˆ๋‚ด๋งŒ ์ถœ๋ ฅํ•œ๋‹ค. ์ด๋•Œ๋Š” ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ๋ฅผ ํ™•์ธํ•˜๊ณ  Cargo.toml ์˜ ๋ฒ„์ „์„ ์ง์ ‘ ์˜ฌ๋ฆฐ ๋’ค ๋‹ค์‹œ ์‹คํ–‰ํ•œ๋‹ค.


Delphi ์—์„œ ์‚ฌ์šฉ

delphi\src\SCAnydoc.pas ๋ฅผ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•œ๋‹ค. DLL ์€ ์‹คํ–‰ ํŒŒ์ผ ์˜†์— ๋‘๊ฑฐ๋‚˜ ๋ฐฐํฌ ํด๋”๋ฅผ PATH ์— ๋„ฃ๋Š”๋‹ค.

uses
  SCAnydoc;

// 1) ํŒŒ์ผ ๋ณ€ํ™˜ โ€” ํŒŒ์ผ ์ฝ๊ธฐ๋ฅผ ๋ธํŒŒ์ด๊ฐ€ ๋‹ด๋‹นํ•˜๋ฏ€๋กœ ์œ ๋‹ˆ์ฝ”๋“œ ๊ฒฝ๋กœ์— ์•ˆ์ „ํ•˜๋‹ค
var LMarkdown := TSCAnydoc.ToMarkdownFile('C:\docs\๋ณด๊ณ ์„œ.docx');

// 2) ๋ฉ”๋ชจ๋ฆฌ ๋ณ€ํ™˜ โ€” CSV ๋Š” ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ์—†์–ด ํ™•์žฅ์ž ํžŒํŠธ๊ฐ€ ํ•„์ˆ˜
var LMarkdown := TSCAnydoc.ToMarkdown(LBytes, 'csv');

// 3) ํฌ๋งท๋งŒ ๊ฐ์ง€ ('docx', 'pdf', 'excel' ... ์‹คํŒจ ์‹œ ๋นˆ ๋ฌธ์ž์—ด)
var LFormat := TSCAnydoc.DetectFormat(LBytes);

// 4) DLL ๊ฐ€์šฉ์„ฑ ํ™•์ธ (์˜ˆ์™ธ๋ฅผ ๋˜์ง€์ง€ ์•Š๋Š”๋‹ค)
if not TSCAnydoc.IsAvailable then
begin
  ShowMessage('sc_anydoc.dll ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.');
end;

์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ

์‹คํŒจ๋Š” EAnydocError ๋กœ ์˜ฌ๋ผ์˜จ๋‹ค. Status ๋กœ ์›์ธ์„ ๊ตฌ๋ถ„ํ•˜๊ณ , Detail ์—๋Š” ์ฝ”์–ด๊ฐ€ ์ค€ ์›๋ณธ(์˜๋ฌธ) ๋ฉ”์‹œ์ง€๊ฐ€ ๋‹ด๊ธด๋‹ค.

try
  LMarkdown := TSCAnydoc.ToMarkdownFile(LFileName);
except
  on E: EAnydocError do
  begin
    if E.Status = asEncrypted then
    begin
      TSCLog.Instance.Warn('์•”ํ˜ธํ™” ๋ฌธ์„œ ๊ฑด๋„ˆ๋œ€: ' + LFileName, 'DOC');
    end
    else
    begin
      TSCLog.Instance.Error(E.Message, 'DOC');
      raise;
    end;
  end;
end;
ํ”„๋กœํผํ‹ฐ ๋‚ด์šฉ
Status asUnsupported / asMalformed / asEncrypted / asResourceLimit / asMissingPart / asIo / asInvalidArg / asPanic / asUnknown
Message ํ•œ๊ธ€๋กœ ์กฐ๋ฆฝ๋œ ํ‘œ์‹œ์šฉ ๋ฉ”์‹œ์ง€
Detail ์ฝ”์–ด๊ฐ€ ์ค€ ์›๋ณธ ๋ฉ”์‹œ์ง€. ํ•ญ์ƒ ์˜๋ฌธ์ด๋ผ ๋กœ์ผ€์ผ์— ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค

์Šค๋ ˆ๋“œ

๋ณ€ํ™˜์€ ๋™๊ธฐ blocking ์ด๋‹ค. ํฐ ๋ฌธ์„œ์—์„œ UI ๊ฐ€ ๋ฉˆ์ถ”๋ฏ€๋กœ, UI ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์›Œ์ปค ์Šค๋ ˆ๋“œ์—์„œ ํ˜ธ์ถœํ•˜๊ณ  ๊ฒฐ๊ณผ๋งŒ TThread.Queue ๋กœ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์— ๋„˜๊ธด๋‹ค.

TThread.CreateAnonymousThread(
  procedure
  var
    LMarkdown: string;   // ์ต๋ช… ๋ฉ”์„œ๋“œ๊ฐ€ ์บก์ฒ˜ํ•˜๋ฏ€๋กœ var ๋ธ”๋ก์— ์„ ์–ธ
  begin
    LMarkdown := TSCAnydoc.ToMarkdown(LBytes, LExt);
    TThread.Queue(nil,
      procedure
      begin
        memResult.Lines.Text := LMarkdown;
      end);
  end).Start;

DLL ์€ ์ „์—ญ ์ƒํƒœ๋ฅผ ๋‘์ง€ ์•Š์•„ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ๋™์‹œ์— ํ˜ธ์ถœํ•ด๋„ ์•ˆ์ „ํ•˜๋‹ค.


VCL ๋ฐ๋ชจ

delphi\demo\ ์— ํ‘œ์ค€ VCL ์ƒ˜ํ”Œ์ด ์žˆ๋‹ค. UI ๋Š” ์˜๋ฌธ์ด๋‹ค.

cd delphi\demo
.\build_demo.ps1 -Run                  # Win64 ๋นŒ๋“œ ํ›„ ์‹คํ–‰
.\build_demo.ps1 -Platform Win32

sc_anydoc.dll ์„ ์‹คํ–‰ ํŒŒ์ผ ์˜†์— ํ•จ๊ป˜ ๋ณต์‚ฌํ•˜๋ฏ€๋กœ PATH ์„ค์ • ์—†์ด ์‹คํ–‰๋œ๋‹ค. IDE ์—์„œ ์—ด๋ ค๋ฉด AnydocDemo.dpr ์„ File > Open Project ๋กœ ์—ด๋ฉด .dproj ๊ฐ€ ์ž๋™ ์ƒ์„ฑ๋œ๋‹ค.

๋ฐ๋ชจ๊ฐ€ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ:

  • ๋ฌธ์„œ ์—ด๊ธฐ / ์ฐฝ์œผ๋กœ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ(WM_DROPFILES) / ์‹คํ–‰ ํŒŒ์ผ์— ๋ฌธ์„œ๋ฅผ ๋–จ์–ด๋œจ๋ ค ์‹คํ–‰
  • ๋ณ€ํ™˜์„ ์›Œ์ปค ์Šค๋ ˆ๋“œ์—์„œ ์ˆ˜ํ–‰ํ•˜๊ณ  UI ๊ฐฑ์‹ ๋งŒ TThread.Queue ๋กœ ์œ„์ž„
  • FormCloseQuery ๋กœ ๋ณ€ํ™˜ ์ค‘ ์ข…๋ฃŒ ์ฐจ๋‹จ โ€” Queue ๋กœ ๋„˜๊ธด ์ฝ”๋“œ๊ฐ€ ํ•ด์ œ๋œ ํผ์„ ๊ฑด๋“œ๋ฆฌ๋Š” AV ๋ฐฉ์ง€
  • EAnydocError.Status / Detail ๋กœ ์‹คํŒจ ์›์ธ ํ‘œ์‹œ
  • ์ƒํƒœ๋ฐ”์— ํฌ๋งทยท์†Œ์š” ์‹œ๊ฐ„ยท์ฝ”์–ด ๋ฒ„์ „ ํ‘œ์‹œ, ๊ฒฐ๊ณผ๋ฅผ UTF-8 .md ๋กœ ์ €์žฅ (UTF-8 BOM ์ฒดํฌ๋ฐ•์Šค๋กœ BOM ์œ ๋ฌด ์„ ํƒ, ๊ธฐ๋ณธ์€ BOM ์—†์Œ)
  • Preview ํƒญ์—์„œ TEdgeBrowser(WebView2) ๋กœ ๋งˆํฌ๋‹ค์šด ๋ Œ๋”๋ง โ€” ์•„๋ž˜ ์ฐธ์กฐ
  • PerMonitorV2 DPI ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํฌํ•จ

๋งˆํฌ๋‹ค์šด ํ”„๋ฆฌ๋ทฐ

Preview.pas ๊ฐ€ TEdgeBrowser ๋ฅผ ํ”„๋ฆฌ๋ทฐ์–ด๋กœ ์šด์ „ํ•œ๋‹ค. ๋งˆํฌ๋‹ค์šด โ†’ HTML ๋ณ€ํ™˜์€ marked ๊ฐ€ ๋‹ด๋‹นํ•˜๋ฉฐ, sc_anydoc.dll ๊ณผ C ABI ๋Š” ์ด ๊ธฐ๋Šฅ์— ๊ด€์—ฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ์…ธ ํŽ˜์ด์ง€๋Š” ํ•œ ๋ฒˆ๋งŒ ๋กœ๋“œํ•œ๋‹ค. preview.html ์— marked.min.js ๋ฅผ ํ†ต์งธ๋กœ ์ธ๋ผ์ธํ•ด(๋‘˜ ๋‹ค RCDATA ๋ฆฌ์†Œ์Šค) NavigateToString ์œผ๋กœ ๋„์šด ๋’ค, ์ดํ›„ ๋งˆํฌ๋‹ค์šด์€ PostWebMessageAsString ์œผ๋กœ ์›๋ฌธ ๊ทธ๋Œ€๋กœ ๋„˜๊ธด๋‹ค โ€” ์žฌํƒ์ƒ‰๋„ JS ๋ฌธ์ž์—ด ์ด์Šค์ผ€์ดํ”„๋„ ์—†๋‹ค
  • ์ดˆ๊ธฐํ™”๋Š” Preview ํƒญ์„ ์ฒ˜์Œ ์—ด ๋•Œ๊นŒ์ง€ ์ง€์—ฐ๋œ๋‹ค. ํ”„๋ฆฌ๋ทฐ๋ฅผ ์“ฐ์ง€ ์•Š์œผ๋ฉด WebView2 ์ƒ์„ฑ ๋น„์šฉ์„ ์ „ํ˜€ ์น˜๋ฅด์ง€ ์•Š๋Š”๋‹ค
  • ์†Œ์Šค๊ฐ€ ๋ฐ”๋€Œ๋ฉด dirty ๋กœ๋งŒ ํ‘œ์‹œํ•˜๊ณ , ์‹ค์ œ ๋ Œ๋”๋Š” ํƒญ์ด ๋ณด์ผ ๋•Œ ํ•œ ๋ฒˆ์— ํ•œ๋‹ค
  • CSP ๋กœ ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐจ๋‹จํ•œ๋‹ค. ์ธ๋ผ์ธ ์Šคํฌ๋ฆฝํŠธยท์Šคํƒ€์ผ๊ณผ https ์ด๋ฏธ์ง€๋งŒ ํ—ˆ์šฉ
  • ๋ฌธ์„œ ์•ˆ์˜ ๋งํฌ๋Š” WebView ์•ˆ์—์„œ ์—ด์ง€ ์•Š๊ณ  ShellExecute ๋กœ ๊ธฐ๋ณธ ๋ธŒ๋ผ์šฐ์ €์— ๋„˜๊ธด๋‹ค
  • WebView2 ๋Ÿฐํƒ€์ž„์ด ์—†์œผ๋ฉด ํ”„๋ฆฌ๋ทฐ ํƒญ์— ์‚ฌ์œ ๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ๋ณ€ํ™˜ยท์ €์žฅ ๊ธฐ๋Šฅ์€ ๊ทธ๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค. ๋Ÿฐํƒ€์ž„์€ ์‹œ์Šคํ…œ์— ์„ค์น˜๋˜๋Š” ๊ตฌ์„ฑ์š”์†Œ์ด๋ฉฐ exe ์˜†์— ๋ณต์‚ฌํ•˜๋Š” ํŒŒ์ผ์ด ์•„๋‹ˆ๋‹ค

build_demo.ps1 ์€ sc_anydoc.dll ๊ณผ ํ•จ๊ป˜ ์•„ํ‚คํ…์ฒ˜์— ๋งž๋Š” WebView2Loader.dll(webview2\x64 / webview2\x86)์„ ์‹คํ–‰ ํŒŒ์ผ ์˜†์— ๋ณต์‚ฌํ•œ๋‹ค. ๋‹ค๋งŒ Delphi 13 ์€ loader ๋ฅผ ์‹คํ–‰ ํŒŒ์ผ์— ์ •์  ๋งํฌํ•˜๋ฏ€๋กœ ๋ฐ๋ชจ๊ฐ€ ์ด DLL ์„ ์‹ค์ œ๋กœ ๋กœ๋“œํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค โ€” ๋ฐฐํฌ ๋ฌถ์Œ์˜ ์™„๊ฒฐ์„ฑ์„ ์œ„ํ•ด ํ•จ๊ป˜ ๋‘˜ ๋ฟ์ด๋‹ค.


C ABI

Delphi ์™ธ์˜ ์–ธ์–ด์—์„œ ์“ธ ๋•Œ ์ฐธ๊ณ . ๋ชจ๋“  ํ•จ์ˆ˜๊ฐ€ cdecl(extern "C") ์ด๋ฉฐ, 32๋น„ํŠธ์—์„œ๋„ export ์ด๋ฆ„์— ๋ฐ์ฝ”๋ ˆ์ด์…˜์ด ๋ถ™์ง€ ์•Š์•„ Win32/Win64 ์„ ์–ธ์ด ๋™์ผํ•˜๋‹ค.

ํ•จ์ˆ˜ ์„ค๋ช…
uint32_t anydoc_abi_version() ABI ๋ฒ„์ „ (ํ˜„์žฌ 1)
const char* anydoc_core_version() ๋งํฌ๋œ anydoc ์ฝ”์–ด ๋ฒ„์ „. ์ •์  ๋ฌธ์ž์—ด โ€” ํ•ด์ œ ๊ธˆ์ง€
const char* anydoc_wrapper_version() ๋ž˜ํผ ๋ฒ„์ „. ํ•ด์ œ ๊ธˆ์ง€
uint32_t anydoc_pointer_size() 4(Win32) ๋˜๋Š” 8(Win64). ๋น„ํŠธ์ˆ˜ ์ง„๋‹จ์šฉ
int32_t anydoc_detect_format(const uint8_t* data, size_t len, char** out_name, size_t* out_name_len) ๋‚ด์šฉ ๊ธฐ๋ฐ˜ ํฌ๋งท ๊ฐ์ง€
int32_t anydoc_to_markdown(const uint8_t* data, size_t len, const char* format_hint, char** out_text, size_t* out_text_len, char** out_err, size_t* out_err_len) ๋ณ€ํ™˜
void anydoc_free(char* p, size_t len) ์œ„ ๋‘ ํ•จ์ˆ˜๊ฐ€ ์ฑ„์šด ๋ฒ„ํผ ํ•ด์ œ

์ƒํƒœ ์ฝ”๋“œ

๊ฐ’ ์˜๋ฏธ ๊ฐ’ ์˜๋ฏธ
0 ์„ฑ๊ณต 5 ํ•„์ˆ˜ ๊ตฌ์„ฑ์š”์†Œ ๋ˆ„๋ฝ
1 ์ง€์›ํ•˜์ง€ ์•Š๋Š” ํฌ๋งท 6 ์ž…์ถœ๋ ฅ ์˜ค๋ฅ˜
2 ์†์ƒ๋œ ๋ฌธ์„œ 7 ์ž˜๋ชป๋œ ์ธ์ž
3 ์•”ํ˜ธํ™”๋œ ๋ฌธ์„œ 8 ์—”์ง„ ๋‚ด๋ถ€ ํŒจ๋‹‰
4 ๋ฆฌ์†Œ์Šค ํ•œ๊ณ„ ์ดˆ๊ณผ 99 ์—…์ŠคํŠธ๋ฆผ ์‹ ๊ทœ ์˜ค๋ฅ˜

๊ทœ์•ฝ

  • ์ถœ๋ ฅ ๋ฌธ์ž์—ด์€ UTF-8, ๊ธธ์ด๊ฐ€ ํ•จ๊ป˜ ๋ฐ˜ํ™˜๋œ๋‹ค. NUL ์ข…๋‹จ๋„ ๋ถ™์ง€๋งŒ ๊ธธ์ด ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•œ๋‹ค
  • anydoc_free ์—๋Š” ํ•จ๊ป˜ ๋ฐ›์€ ๊ธธ์ด๋ฅผ ๊ทธ๋Œ€๋กœ ๋„˜๊ธด๋‹ค. Rust ํ• ๋‹น์ž๊ฐ€ ํ•ด์ œํ•˜๋ฏ€๋กœ ํ˜ธ์ถœ ์ธก์—์„œ free/FreeMem ํ•˜๋ฉด ์•ˆ ๋œ๋‹ค
  • ๋ชจ๋“  ์ง„์ž…์ ์ด catch_unwind ๋กœ ๊ฐ์‹ธ์—ฌ ์žˆ์–ด Rust ํŒจ๋‹‰์ด FFI ๊ฒฝ๊ณ„๋ฅผ ๋„˜์ง€ ์•Š๋Š”๋‹ค
  • format_hint ๋Š” ํ™•์žฅ์ž ๋ฌธ์ž์—ด("docx", ".pdf", "csv"). ์ ์€ ์žˆ์–ด๋„ ์—†์–ด๋„ ๋œ๋‹ค. ํฌ๋งท์€ ๋‚ด์šฉ ๊ฐ์ง€๋ฅผ ๋จผ์ € ์‹œ๋„ํ•˜๊ณ  ์‹คํŒจ ์‹œ ํžŒํŠธ๋กœ ํด๋ฐฑํ•˜๋ฏ€๋กœ, ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ์—†๋Š” CSV ๋Š” ํžŒํŠธ๊ฐ€ ํ•„์ˆ˜๋‹ค
  • ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ๋„˜๊ธฐ๋Š” API ๋Š” ์ผ๋ถ€๋Ÿฌ ๋‘์ง€ ์•Š์•˜๋‹ค. ํ˜ธ์ถœ ์ธก์ด ๋ฐ”์ดํŠธ๋ฅผ ์ฝ์–ด ๋„˜๊ธฐ๋ฉด Windows ์œ ๋‹ˆ์ฝ”๋“œ ๊ฒฝ๋กœ ์ธ์ฝ”๋”ฉ ๋ฌธ์ œ๊ฐ€ ์•„์˜ˆ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค

์•Œ๋ ค์ง„ ์ œ์•ฝ

  • PDF ๋Š” ๋ฌธ์„œ ๋ชจ๋ธ(to_document)์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค (์—…์ŠคํŠธ๋ฆผ ์ œ์•ฝ). ๋งˆํฌ๋‹ค์šด ๋ณ€ํ™˜๋งŒ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์Šค์บ”๋ณธ/์ด๋ฏธ์ง€ PDF ๋Š” OCR ์ด ํ•„์š”ํ•ด Unsupported ๋กœ ๋–จ์–ด์ง„๋‹ค. PDF ๋ณ€ํ™˜ ํ’ˆ์งˆ์€ ์—…์ŠคํŠธ๋ฆผ์ด ์“ฐ๋Š” pdf-inspector ์ˆ˜์ค€์— ์ข…์†๋˜๋ฏ€๋กœ, ์‹ค์‚ฌ์šฉ ์ƒ˜ํ”Œ๋กœ ํ™•์ธํ•ด ๋ณด๋Š” ๊ฒƒ์ด ์ข‹๋‹ค
  • Win32 ๋ฉ”๋ชจ๋ฆฌ ํ•œ๊ณ„ โ€” ๋ฌธ์„œ ์ „์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ ค ํŒŒ์‹ฑํ•œ๋‹ค. 32๋น„ํŠธ ํ”„๋กœ์„ธ์Šค์˜ ์ฃผ์†Œ ๊ณต๊ฐ„(๊ธฐ๋ณธ 2GB) ์•ˆ์—์„œ ์ˆ˜๋ฐฑ MB ๊ธ‰ ๋ฌธ์„œ๋Š” ์‹คํŒจํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์œผ๋ฉด ํ˜ธ์ถœ ์ธก์—์„œ ์ž…๋ ฅ ํฌ๊ธฐ ์ƒํ•œ์„ ๋‘๋Š” ํŽธ์ด ์•ˆ์ „ํ•˜๋‹ค
  • ์—…์ŠคํŠธ๋ฆผ to_document(๋ฌธ์„œ ๋ชจ๋ธ ํŠธ๋ฆฌ)๋Š” C ABI ๋กœ ๋…ธ์ถœํ•˜์ง€ ์•Š์•˜๋‹ค. ํ•„์š”ํ•˜๋ฉด JSON ์ง๋ ฌํ™” ํ˜•ํƒœ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค

๊ตฌ์„ฑ

Cargo.toml                crates.io ์˜ anydoc ์„ ์˜์กด์„ฑ์œผ๋กœ ์ฐธ์กฐ (ํฌํฌยท๋ฒค๋”๋ง ์—†์Œ)
.cargo\config.toml        ํƒ€๊นƒ๋ณ„ CRT ์ •์  ๋งํฌ ๊ณ ์ •
build.rs                  Cargo.lock ์˜ ์ฝ”์–ด ๋ฒ„์ „์„ DLL ์— ์ƒˆ๊น€
src\lib.rs                C ABI ๋ž˜ํผ
build_anydoc.ps1          ๋นŒ๋“œ โ†’ ๊ฒ€์ฆ โ†’ ๋ฐฐํฌ
verify_dll.ps1            ABI ๊ฒ€์ฆ (32๋น„ํŠธ๋Š” ์ž๋™ ์žฌ์‹คํ–‰)
update_upstream.ps1       ์—…์ŠคํŠธ๋ฆผ ํ™•์ธ ๋ฐ ๋ฐ˜์˜
delphi\src\SCAnydoc.pas   Delphi ๋ฐ”์ธ๋”ฉ
delphi\demo\              VCL ๋ฐ๋ชจ (dpr/pas/dfm/manifest/rc + build_demo.ps1)
  Preview.pas             TEdgeBrowser ๋ฅผ ์šด์ „ํ•˜๋Š” ๋งˆํฌ๋‹ค์šด ํ”„๋ฆฌ๋ทฐ
  preview.html            ํ”„๋ฆฌ๋ทฐ ์…ธ ํŽ˜์ด์ง€ (RCDATA)
  marked.min.js           ๋งˆํฌ๋‹ค์šด ๋ Œ๋”๋Ÿฌ (RCDATA, MIT)
  webview2\x64|x86\       WebView2Loader.dll (๋นŒ๋“œ ์‹œ exe ์˜†์œผ๋กœ ๋ณต์‚ฌ)

๋ผ์ด์„ ์Šค

MIT โ€” LICENSE ์ฐธ์กฐ.

์—…์ŠคํŠธ๋ฆผ anydoc ํฌ๋ ˆ์ดํŠธ๋„ MIT ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๊ฐ€ ๋งŒ๋“  ๋ฐ”์ด๋„ˆ๋ฆฌ์— ์ •์ ์œผ๋กœ ๋งํฌ๋˜๋ฏ€๋กœ, ์žฌ๋ฐฐํฌํ•  ๋•Œ ํ•ด๋‹น ๊ณ ์ง€๋ฅผ ์œ ์ง€ํ•œ๋‹ค โ€” THIRD-PARTY-NOTICES.md ์ฐธ์กฐ.

About

Windows DLL (C ABI) wrapper around firecrawl/anydoc, with a Delphi binding and VCL demo. Converts Office/OpenDocument/RTF/EPUB/CSV/PDF to GitHub Flavored Markdown.

Resources

Stars

10 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages