BentoPDF
Tutti gli strumenti per i PDF, senza caricare i file da nessuna parte
Cosa fa
Una raccolta di strumenti per i PDF (unire, dividere, comprimere, convertire, firmare) che funziona interamente nel browser: i documenti non vengono mai caricati su un server.
Come guadagna
Progetto open source su GitHub con oltre 16.000 stelle, che non dichiara incassi. Ha licenza AGPL: puoi partire dal suo codice, ma se offri la tua versione online devi pubblicare anche il tuo codice modificato. Idee nostre per guadagnare: versione per aziende con il proprio marchio, funzioni avanzate a pagamento, pubblicità discreta.
Rendilo tuo
- Per studi professionali italiani: documenti dei clienti che non devono uscire dall'ufficio.
- Strumenti per i formati italiani: firma digitale .p7m, documenti per la PA.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "PDF Privato": una raccolta di strumenti per i PDF (unire, dividere, estrarre pagine, ruotare, comprimere, aggiungere numeri di pagina, filigrana, firma) che funziona interamente nel browser: i documenti non vengono mai caricati. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con tutti gli strumenti e "I tuoi PDF non lasciano il computer"
2. Pagina di ogni strumento con area di trascinamento e anteprima delle pagine
3. Organizza: miniature delle pagine da riordinare, ruotare, eliminare
4. Pagina "Perché è sicuro" con la prova da fare staccando internet
5. Pagina Pro
Stile: pulito e affidabile: sfondo bianco, rosso PDF #DC2626 solo per i dettagli, blu #1D4ED8 per le azioni, carattere "Inter", miniature delle pagine in griglia. Nessuna immagine generica di stock.
Tutto deve funzionare perfettamente da telefono. Tutti i testi in italiano, chiari e senza parole tecniche.
2. Database, account e sicurezza
Collega il progetto a Supabase e attiva la registrazione con email e password.
Crea queste tabelle:
- nessun documento viene salvato o caricato
- "profili": piano
Regole di sicurezza obbligatorie:
- i PDF restano sul dispositivo dell'utente
- il piano non si modifica dal browser
Usa esattamente il codice SQL che trovi nei "Dettagli tecnici" di questa scheda: eseguilo nel SQL Editor di Supabase prima di continuare, poi collega le pagine alle tabelle.
3. Strumenti che lavorano nel browser
Tutti gli strumenti usano pdf-lib (modifica dei PDF) e pdf.js (miniature delle pagine) nel browser. Per dividere un PDF l'utente scrive gli intervalli come in stampa, "1-3, 5, 8-10", e il sito crea un file per ogni intervallo (codice nei Dettagli tecnici).
La pagina "Organizza" mostra le miniature: si trascinano per riordinare, si ruotano, si eliminano, si inseriscono pagine da un altro PDF.
Il sito funziona anche offline come PWA: è la prova più semplice che i file non vengono inviati. I PDF protetti da password si aprono solo se l'utente la inserisce.
4. Pro e pubblicità
Gratis: tutti gli strumenti per file fino a 50 MB, con una pubblicità discreta fuori dall'area di lavoro.
Pro: file più grandi, lavorazione di più file insieme, compressione più forte, nessuna pubblicità.
5. Pagamenti con Stripe
Aggiungi un pagamento singolo di 7,99 € una volta sola. Il pagamento sblocca file grandi, lavorazione in blocco, compressione forte e toglie la pubblicità.
A pagamento riuscito il webhook imposta "piano" a "pro" nella tabella "profili", sulla riga dell'utente indicata in client_reference_id.
Per la sessione di pagamento e il webhook segui la guida "Pagamenti con Stripe" di Fattibile.
6. Controlli specifici di questo progetto
Oltre ai controlli della guida "Controllo finale", verifica in particolare:
1. Intervalli: dividi un PDF di 10 pagine con "1-3, 5, 8-10, 12": deve creare 3 file e segnalare che la pagina 12 non esiste.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Dividere un PDF per intervalli
Legge intervalli scritti come in stampa ("1-3, 5, 8-10") e crea un nuovo PDF per ciascuno, nel browser.
import { PDFDocument } from "pdf-lib";
export function leggiIntervalli(testo: string, totalePagine: number) {
const intervalli: number[][] = [];
const errori: string[] = [];
for (const parte of testo.split(",").map((s) => s.trim()).filter(Boolean)) {
const m = parte.match(/^(\d+)(?:\s*-\s*(\d+))?$/);
if (!m) { errori.push("Non capisco \"" + parte + "\""); continue; }
const da = Number(m[1]), a = Number(m[2] ?? m[1]);
if (da < 1 || a > totalePagine || da > a) { errori.push("Pagine " + parte + " non valide (il PDF ne ha " + totalePagine + ")"); continue; }
intervalli.push(Array.from({ length: a - da + 1 }, (_, i) => da + i - 1)); // indici da 0
}
return { intervalli, errori };
}
export async function dividi(file: File, testoIntervalli: string): Promise<{ file: Blob[]; errori: string[] }> {
const originale = await PDFDocument.load(await file.arrayBuffer());
const { intervalli, errori } = leggiIntervalli(testoIntervalli, originale.getPageCount());
const risultati: Blob[] = [];
for (const pagine of intervalli) {
const nuovo = await PDFDocument.create();
const copiate = await nuovo.copyPages(originale, pagine);
copiate.forEach((p) => nuovo.addPage(p));
risultati.push(new Blob([await nuovo.save()], { type: "application/pdf" }));
}
return { file: risultati, errori };
}
Pezzi comuni a tutti i progetti
Glossario
- pdf-lib
- Una libreria gratuita che crea e modifica PDF direttamente nel browser.
- PWA
- Un sito che si installa come un'app e funziona anche senza connessione.