Skip to main content
Відкритий кодТехнічне

Як ми створили безкоштовний редактор PDF з відкритим кодом на Next.js

Технічний детальний огляд створення EditoraPDF — нашого шляху від ідеї до готового до продакшену редактора PDF з відкритим кодом

Автор: EditoraPDF Team

Коли ми взялися за створення EditoraPDF, у нас була одна чітка мета: створити абсолютно безкоштовний редактор PDF з відкритим кодом, який поважає приватність користувачів і працює повністю в браузері. Жодних серверів, жодних завантажень, жодного відстеження — лише чиста обробка на стороні клієнта.

Це історія про те, як ми його створювали, з якими технічними викликами зіткнулися та які рішення ухвалювали на цьому шляху. Незалежно від того, чи ви розробник, який хоче створити щось подібне, чи просто цікавитеся розробкою з відкритим кодом, ця стаття дасть вам повний погляд зсередини.

Бачення: редагування PDF з пріоритетом приватності

Більшість сучасних редакторів PDF вимагають завантажувати документи на їхні сервери. Для конфіденційних документів, як-от контракти, медичні записи чи фінансові звіти, це справжній кошмар для приватності.

Ми хотіли створити щось інше:

  • 100% обробка на стороні клієнта — файли ніколи не залишають ваш браузер
  • Не потрібно встановлювати — працює безпосередньо у вебпереглядачах
  • Без реєстрації та відстеження — повністю анонімне використання
  • Відкритий код — прозорий код, який кожен може перевірити
  • Безкоштовно назавжди — жодних платних бар'єрів чи підписок

Маючи на увазі ці принципи, ми почали оцінювати технології, які могли б втілити це бачення в реальність.

Вибір технологічного стеку

Frontend-фреймворк: Next.js 14

Ми обрали Next.js 14 з новим App Router з кількох причин:

  • Чудові можливості для SEO — серверний рендеринг і керування метаданими з коробки
  • Підтримка статичного експорту — розгортання будь-де (Vercel, Netlify, GitHub Pages)
  • Інтеграція TypeScript — типобезпека та кращий досвід розробки
  • Оптимізація продуктивності — автоматичне розбиття коду, оптимізація зображень
  • Досвід розробки — гаряче перезавантаження, чудова документація, величезна екосистема

Рендеринг PDF: PDF.js

PDF.js від Mozilla — золотий стандарт для рендерингу PDF у браузері. Саме він живить вбудований переглядач PDF у Firefox.

Ключові переваги:

  • Перевірений у мільйонах браузерів
  • Чудова якість рендерингу
  • Можливості вилучення тексту
  • Рендеринг на основі canvas для продуктивності
  • Активна підтримка від Mozilla

Маніпуляція PDF: pdf-lib

Для створення та зміни PDF ми використовуємо pdf-lib — бібліотеку на чистому JavaScript, яка працює повністю в браузері.

Ключові можливості:

  • Створення PDF з нуля
  • Зміна наявних PDF (додавання сторінок, обертання, видалення)
  • Вбудовування тексту, зображень і фігур
  • Копіювання сторінок між документами
  • Жодних залежностей від Node.js

Керування станом: Zustand

Замість Redux ми обрали Zustand — мінімалістичну та швидку бібліотеку для керування станом.

  • Простий API — без шаблонного коду
  • Дизайн із пріоритетом TypeScript
  • Малий розмір бандлу (~1KB)
  • Не потрібні провайдери контексту

Стилізація: Tailwind CSS

Tailwind CSS дає нам стилізацію за принципом utility-first з чудовим досвідом розробки та малими продакшен-бандлами завдяки автоматичному очищенню.

Архітектура та проєктні рішення

1. Лише обробка на стороні клієнта

Усе відбувається в браузері:

User uploads PDF
  ↓
PDF.js parses and renders to canvas
  ↓
User makes edits (text, images, shapes)
  ↓
pdf-lib creates new PDF with changes
  ↓
Download to user's device

Файл у жодний момент не залишає пристрій користувача. Це справжня приватність за дизайном.

2. Нормалізована система координат

Один важливий виклик: PDF мають різні розміри сторінок, а користувачі можуть збільшувати/зменшувати масштаб. Як відстежувати позиції накладень?

Рішення: Нормалізувати всі координати до діапазону [0, 1].

// Instead of absolute pixels:
{ x: 150, y: 200 }

// We store normalized coordinates:
{ x: 0.25, y: 0.33 }

// Then scale to current viewport:
actualX = normalizedX * pageWidth * zoom
actualY = normalizedY * pageHeight * zoom

Це робить накладення незалежними від масштабу та переносними між різними розмірами сторінок.

3. Архітектура компонентів

Ми структурували застосунок у сфокусовані компоненти:

  • PdfViewer — рендеринг основного canvas
  • Thumbnails — бічна панель навігації сторінками
  • Toolbar — елементи керування масштабом, обертанням, видаленням
  • EditToolbar — вибір інструмента (текст, зображення, фігура)
  • AdvancedOverlayLayer — рендеринг тексту, зображень, фігур
  • ExportButton — логіка експорту PDF

4. Шаблон керування станом

Наше сховище Zustand підтримує:

{
  originalFile: File,
  pages: [
    {
      id: string,
      originalIndex: number,
      rotation: 0 | 90 | 180 | 270,
      deleted: boolean,
      textOverlays: [],
      imageOverlays: [],
      shapeOverlays: []
    }
  ],
  selectedPageId: string,
  zoom: number,
  editMode: 'select' | 'text' | 'image' | 'shape'
}

Технічні виклики, з якими ми зіткнулися

Виклик 1: точність вилучення тексту

PDF.js може вилучати текст, але позиціонування не завжди ідеально точне через те, як PDF кодують текст (іноді як окремі символи, іноді як слова).

Рішення: Ми вилучаємо текстові елементи з їхніми матрицями перетворення та конвертуємо їх у нормалізовані координати з широкими обмежувальними рамками.

Виклик 2: продуктивність із великими PDF

Рендеринг PDF із понад 100 сторінками може заморозити браузер.

Рішення:

  • Лінива загрузка сторінок (рендеринг лише видимих сторінок)
  • Використання requestAnimationFrame для плавного рендерингу
  • Рекомендоване обмеження 25MB / 50 сторінок
  • Offscreen canvas для мініатюр

Виклик 3: якість експорту

Вбудовування тексту та зображень у pdf-lib вимагає ретельного перетворення координат із простору браузера в простір PDF.

Рішення: Побудувати комплексний конвеєр перетворень, який обробляє:

  • Обертання сторінок
  • Відмінності систем координат (вісь Y перевернута в PDF)
  • Вбудовування та масштабування шрифтів
  • Конвертацію форматів зображень

Виклик 4: сумісність із браузерами

Різні браузери мають дещо відмінні реалізації canvas та особливості рендерингу PDF.

Рішення: Ретельне тестування в Chrome, Firefox, Safari та Edge. Використання виявлення можливостей замість виявлення браузера.

Чому ми зробили його з відкритим кодом

З першого дня ми знали, що це має бути з відкритим кодом:

1. Прозорість = довіра

Коли йдеться про конфіденційні документи, користувачам потрібно переконатися, що файли справді залишаються локальними. Відкритий код дозволяє кожному перевірити код.

2. Внески спільноти

Відкритий код дозволяє розробникам з усього світу додавати функції, виправляти помилки та вдосконалювати інструмент.

3. Навчальний ресурс

Ми багато чого навчилися з проєктів з відкритим кодом. Тепер ми можемо віддячити та допомогти іншим вивчати Next.js, обробку PDF і веброзробку.

4. Довговічність

Навіть якщо ми припинимо підтримку, спільнота може зробити форк і продовжити розробку. Інструмент житиме далі.

Результати

Після місяців розробки ми запустили EditoraPDF з:

100%
Обробка на стороні клієнта
0 KB
Даних завантажено на сервери
MIT
Ліцензія з відкритим кодом
$0
Безкоштовно назавжди

Кодова база доступна за адресою github.com/affsquadDevs/editorapdf за ліцензією MIT.

Ключові висновки для розробників

  • Обробка на стороні клієнта потужна — Сучасні браузери можуть виконувати складні завдання, які раніше вимагали серверів
  • Обирайте правильні бібліотеки — PDF.js і pdf-lib зекономили нам місяці розробки
  • Нормалізація координат — ключ до успіху — Робить накладення переносними та незалежними від масштабу
  • Продуктивність має значення — Лінива загрузка та оптимізація критично важливі для великих файлів
  • Відкритий код приносить користь усім — Прозорість, спільнота та навчання — усі у виграші

Долучайтеся

EditoraPDF — це проєкт з відкритим кодом, і ми вітаємо внески від розробників будь-якого рівня.

Поширені запитання

На якому технологічному стеку побудований EditoraPDF?

EditoraPDF побудований на Next.js 14, TypeScript, React 18, PDF.js для рендерингу, pdf-lib для маніпуляцій, Zustand для керування станом і Tailwind CSS для стилізації. Він повністю з відкритим кодом за ліцензією MIT.

Чому ви обрали Next.js для редактора PDF?

Next.js забезпечує чудову продуктивність, можливості для SEO, підтримку статичного експорту та відмінний досвід розробки. App Router спрощує створення швидких і дружніх до SEO застосунків, які можна розгорнути будь-де.

EditoraPDF справді з відкритим кодом?

Так, EditoraPDF на 100% з відкритим кодом за ліцензією MIT. Повний вихідний код доступний на GitHub за адресою github.com/affsquadDevs/editorapdf

Як працює обробка PDF на стороні клієнта?

PDF.js рендерить PDF на HTML canvas у браузері, тоді як pdf-lib маніпулює структурою PDF. Уся обробка відбувається локально в браузері користувача за допомогою JavaScript, що забезпечує повну приватність і безпеку без жодних завантажень на сервер.

Чи можу я використовувати код EditoraPDF у власному проєкті?

Звісно! EditoraPDF ліцензований за MIT, що означає, що ви можете вільно використовувати, змінювати та поширювати код, навіть у комерційних проєктах. Просто додайте оригінальне повідомлення про ліцензію.

Як я можу зробити внесок у проєкт?

Перегляньте наш Посібник для контриб'юторів на GitHub. Ви можете робити внесок у код, повідомляти про помилки, пропонувати функції, покращувати документацію чи допомагати з тестуванням.

Підсумкові думки

Створення EditoraPDF було складним, але корисним шляхом. Ми навчилися безмежно багато про обробку PDF, можливості браузерів і розробку з відкритим кодом.

Найкраще? Тепер будь-хто може взяти цей код, навчитися на ньому, змінити його чи створити щось ще краще. У цьому й сила відкритого коду.

Якщо ви працюєте над подібним проєктом чи просто цікавитеся кодом, перегляньте репозиторій на GitHub. Ми будемо раді почути ваші відгуки, відповісти на запитання чи розглянути ваші pull request.