github DDULDDUCK/every-pdf v2.1.0
2.1.0

3 hours ago

v2.1.0 - License Compliance & PDFium Engine Migration

This release replaces the bundled Poppler library (GPL) with pypdfium2 (Apache-2.0 OR BSD-3-Clause) so that Every-PDF is now fully compatible with its MIT license. PDF-to-image conversion has been rewritten on top of Google's PDFium engine, and the macOS / Windows installers no longer ship any GPL-licensed binaries.

๐Ÿ› ๏ธ Breaking Internals

  • Poppler replaced with pypdfium2 in the PDFโ†’image pipeline: pdf2image.convert_from_path() has been swapped for pypdfium2.PdfDocument.render(). PDFium is the same engine Chrome uses, so rendering quality and 300 DPI output remain identical.
  • No more bundled GPL binaries: Approximately 98 MB of Poppler binaries (pdftoppm, pdftocairo, etc.) have been removed from backend/src/poppler/. The new engine ships its native library inside the Python wheel.
  • No external system dependency: Users no longer need Poppler installed on their machine; everything is bundled into the app.

๐Ÿ› Bug Fixes

  • PyInstaller bundling for native dependency hardened: Switched from a bare --hidden-import to --collect-all pypdfium2 / pypdfium2_raw so that libpdfium.dylib / pdfium.dll and the accompanying version.json data files are collected into the production bundle. Verified end-to-end against a real packaged .app / .exe.

โš™๏ธ Code Refinement

  • CI release workflow loosened: Changed npm ci โ†’ npm install in release.yml so that small lockfile drift between local npm and the runner's npm version no longer fails the release pipeline.
  • Build artifacts no longer tracked: Added __pycache__/, *.pyc, backend/build/, backend/pdf_processor.spec, .DS_Store, and .omc/ to .gitignore, and untracked ~30 previously committed PyInstaller intermediates and Python bytecode files.
  • Python requirement clarified in docs: README files now state Python 3.10+ as the requirement (the codebase has been using 3.10+ union type syntax for a while; the previous "3.9 or higher" line was misleading).
  • License dialog refreshed: Updated the in-app library listing to reflect pypdfium2 instead of pdf2image, and bumped LICENSE copyright year to 2025-2026.

๐Ÿ“œ License Notice

Every-PDF v2.1.0 and later are fully MIT-licensed with no GPL dependencies in the distributed binaries. Versions v2.0.x and earlier bundled Poppler (GPL-2/3) inside an MIT-licensed app, which created a license conflict that this release resolves. We strongly recommend upgrading to v2.1.0+ for any new deployments. See issue #15 for context.

๐Ÿ™Œ Thanks

  • Special thanks to @xinyu-391 for reporting the Poppler license conflict in #15.

v2.1.0 - ๋ผ์ด์„ผ์Šค ์ •ํ•ฉ์„ฑ ํ™•๋ณด ๋ฐ PDFium ์—”์ง„ ์ „ํ™˜

์ด๋ฒˆ ๋ฆด๋ฆฌ์ฆˆ๋Š” ๋ฒˆ๋“ค๋œ Poppler ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(GPL)๋ฅผ pypdfium2 (Apache-2.0 OR BSD-3-Clause)๋กœ ๊ต์ฒดํ•˜์—ฌ Every-PDF๊ฐ€ ์ž์‹ ์˜ MIT ๋ผ์ด์„ผ์Šค์™€ ์™„์ „ํžˆ ํ˜ธํ™˜๋˜๋„๋ก ์ •๋ฆฌํ•œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. PDFโ†’์ด๋ฏธ์ง€ ๋ณ€ํ™˜์€ Google์˜ PDFium ์—”์ง„ ์œ„์—์„œ ์žฌ์ž‘์„ฑ๋˜์—ˆ๊ณ , macOS / Windows ๋ฐฐํฌ๋ฌผ์—์„œ GPL ๋ผ์ด์„ผ์Šค ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ๋ชจ๋‘ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ ๋‚ด๋ถ€ ์—”์ง„ ๊ต์ฒด

  • PDFโ†’์ด๋ฏธ์ง€ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ Poppler๋ฅผ pypdfium2๋กœ ๊ต์ฒด: pdf2image.convert_from_path()๋ฅผ pypdfium2.PdfDocument.render()๋กœ ๋Œ€์ฒดํ–ˆ์Šต๋‹ˆ๋‹ค. PDFium์€ Chrome์ด ์‚ฌ์šฉํ•˜๋Š” ์—”์ง„๊ณผ ๋™์ผํ•˜๋ฉฐ, 300 DPI ๋ Œ๋”๋ง ํ’ˆ์งˆ์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
  • ๋ฒˆ๋“ค๋œ GPL ๋ฐ”์ด๋„ˆ๋ฆฌ ์™„์ „ ์ œ๊ฑฐ: backend/src/poppler/์— ํฌํ•จ๋˜์–ด ์žˆ๋˜ ์•ฝ 98 MB ๋ถ„๋Ÿ‰์˜ Poppler ๋ฐ”์ด๋„ˆ๋ฆฌ(pdftoppm, pdftocairo ๋“ฑ)๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ ์—”์ง„์€ ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ Python wheel ๋‚ด๋ถ€์— ๋™๋ด‰ํ•˜๋ฏ€๋กœ ๋ณ„๋„ ๋ฐฐํฌ๊ฐ€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.
  • ์™ธ๋ถ€ ์‹œ์Šคํ…œ ์˜์กด์„ฑ ์ œ๊ฑฐ: ์‚ฌ์šฉ์ž๊ฐ€ ๋ณ„๋„๋กœ Poppler๋ฅผ ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์•ฑ ์•ˆ์—์„œ ๋ชจ๋“  ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚ฉ๋‹ˆ๋‹ค.

๐Ÿ› ๋ฒ„๊ทธ ์ˆ˜์ •

  • PyInstaller์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์˜์กด์„ฑ ๋ฒˆ๋“ค๋ง ๊ฐ•ํ™”: ๊ธฐ์กด์˜ ๋‹จ์ˆœ --hidden-import ๋ฐฉ์‹์„ --collect-all pypdfium2 / pypdfium2_raw๋กœ ๊ต์ฒดํ•˜์—ฌ libpdfium.dylib / pdfium.dll๊ณผ ํ•จ๊ป˜ version.json ๋ฐ์ดํ„ฐ ํŒŒ์ผ๊นŒ์ง€ ๋ฐฐํฌ ๋ฒˆ๋“ค์— ํฌํ•จ๋˜๋„๋ก ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ํŒจํ‚ค์ง•๋œ .app / .exe๋ฅผ ์‚ฌ์šฉํ•ด end-to-end ๊ฒ€์ฆ์„ ๋งˆ์ณค์Šต๋‹ˆ๋‹ค.

โš™๏ธ ์ฝ”๋“œ ๊ฐœ์„ 

  • CI ๋ฆด๋ฆฌ์ฆˆ ์›Œํฌํ”Œ๋กœ ์™„ํ™”: release.yml์˜ npm ci๋ฅผ npm install๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋กœ์ปฌ npm๊ณผ runner์˜ npm ๋ฒ„์ „ ์ฐจ์ด๋กœ ์ธํ•œ ์‚ฌ์†Œํ•œ lockfile ๋ถˆ์ผ์น˜๊ฐ€ ๋ฆด๋ฆฌ์ฆˆ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋ง‰์ง€ ์•Š๋„๋ก ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋นŒ๋“œ ์‚ฐ์ถœ๋ฌผ ์ถ”์  ํ•ด์ œ: __pycache__/, *.pyc, backend/build/, backend/pdf_processor.spec, .DS_Store, .omc/๋ฅผ .gitignore์— ์ถ”๊ฐ€ํ•˜๊ณ , ์ž˜๋ชป ์ถ”์ ๋˜๊ณ  ์žˆ๋˜ ์•ฝ 30๊ฐœ์˜ PyInstaller ์ค‘๊ฐ„ ์‚ฐ์ถœ๋ฌผ๊ณผ Python ๋ฐ”์ดํŠธ์ฝ”๋“œ ํŒŒ์ผ์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.
  • Python ์š”๊ตฌ์‚ฌํ•ญ ํ‘œ๊ธฐ ์ •๋ฆฌ: README์˜ Python ์š”๊ตฌ ๋ฒ„์ „์„ v3.10 ์ด์ƒ์œผ๋กœ ๊ฐฑ์‹ ํ–ˆ์Šต๋‹ˆ๋‹ค. (์ฝ”๋“œ๋ฒ ์ด์Šค๋Š” ์ด๋ฏธ ํ•œ์ฐธ ์ „๋ถ€ํ„ฐ 3.10+์˜ union ํƒ€์ž… ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด์˜ "3.9 ์ด์ƒ" ํ‘œ๊ธฐ๋Š” ๋ถ€์ •ํ™•ํ–ˆ์Šต๋‹ˆ๋‹ค.)
  • ๋ผ์ด์„ผ์Šค ๋‹ค์ด์–ผ๋กœ๊ทธ ๊ฐฑ์‹ : ์•ฑ ๋‚ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชฉ๋ก์—์„œ pdf2image ๋Œ€์‹  pypdfium2๋ฅผ ํ‘œ๊ธฐํ•˜๋„๋ก ์ˆ˜์ •ํ–ˆ๊ณ , LICENSE ์ €์ž‘๊ถŒ ์—ฐ๋„๋ฅผ 2025-2026์œผ๋กœ ๊ฐฑ์‹ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“œ ๋ผ์ด์„ผ์Šค ์•ˆ๋‚ด

Every-PDF v2.1.0 ์ด์ƒ์€ ๋ฐฐํฌ ๋ฐ”์ด๋„ˆ๋ฆฌ์— GPL ์˜์กด์„ฑ์ด ์—†๋Š” ์™„์ „ํ•œ MIT ๋ผ์ด์„ผ์Šค ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. v2.0.x ์ดํ•˜ ๋ฒ„์ „์€ MIT ๋ผ์ด์„ผ์Šค๋กœ ํ‘œ๊ธฐ๋œ ์•ฑ ์•ˆ์— Poppler(GPL-2/3) ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋ฒˆ๋“คํ•˜๊ณ  ์žˆ์–ด ๋ผ์ด์„ผ์Šค ์ถฉ๋Œ์ด ์กด์žฌํ–ˆ์œผ๋ฉฐ, ์ด๋ฒˆ ๋ฆด๋ฆฌ์ฆˆ๊ฐ€ ๊ทธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ ๋ฐฐํฌํ•˜์‹œ๋Š” ๊ฒฝ์šฐ v2.1.0+ ์‚ฌ์šฉ์„ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋งฅ๋ฝ์€ ์ด์Šˆ #15์„ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.

๐Ÿ™Œ ๊ฐ์‚ฌ

  • Poppler ๋ผ์ด์„ผ์Šค ์ถฉ๋Œ ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ ํ•ด์ฃผ์‹  @xinyu-391๋‹˜๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. (#15)

Don't miss a new every-pdf release

NewReleases is sending notifications on new releases.