firecrawl/anydoc ์ Windows DLL(C ABI) ๋ก ๊ฐ์ธ๊ณ , Delphi ์์ ๋ฐ๋ก ์ธ ์ ์๊ฒ ๋ง๋ ๋ํผ.
Word / PowerPoint / Excel / OpenDocument / RTF / EPUB / CSV / PDF ๋ฅผ GitHub Flavored Markdown ์ผ๋ก ๋ณํํ๋ค.
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) | ๋ธํ์ด ๋ฐ์ธ๋ฉยท๋ฐ๋ชจ๋ฅผ ์ธ ๋๋ง |
.\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\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 ์ ์ ์ญ ์ํ๋ฅผ ๋์ง ์์ ์ฌ๋ฌ ์ค๋ ๋์์ ๋์์ ํธ์ถํด๋ ์์ ํ๋ค.
delphi\demo\ ์ ํ์ค VCL ์ํ์ด ์๋ค. UI ๋ ์๋ฌธ์ด๋ค.
cd delphi\demo
.\build_demo.ps1 -Run # Win64 ๋น๋ ํ ์คํ
.\build_demo.ps1 -Platform Win32sc_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 ์ ์ค์ ๋ก ๋ก๋ํ์ง๋ ์๋๋ค โ ๋ฐฐํฌ ๋ฌถ์์ ์๊ฒฐ์ฑ์ ์ํด ํจ๊ป ๋ ๋ฟ์ด๋ค.
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 ์ฐธ์กฐ.