Comprimere PDF su Linux utilizzando Ghostscript

Documenti da scansionare

Ti è mai capitato di dover scansionare un documento di diverse pagine e di accorgerti solo alla fine che il file PDF ottenuto abbia un peso spropositato?

A me è capitato giusto ieri. Dovevo mandare una serie di scartoffie al commercialista ma il file PDF che ho ottenuto risultava troppo pesante (11 MB) per il form di caricamento dei documenti (max 5MB).

Per risolvere questi tipi di problemi esistono vari servizi online che ti permettono di caricare il file PDF e di comprimerlo senza dover installare nulla nel tuo PC. Tuttavia, trattandosi di documenti privati ho pensato non fosse il caso di regalare così i miei dati ad un servizio che non so cosa combini con i documenti caricati dagli utenti.

Quindi mi sono arrovellato il cervello e mi sono chiesto: “Possibile che su Ubuntu non esista nulla che permette di comprimere i PDF direttamente dal terminale?

Ovviamente la risposta a tale domanda è: si, esiste il modo di comprimere i file PDF direttamente da terminale. E per farlo esiste il seguente non-troppo-semplice comando di GhostScript:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=<LIVELLO-COMPRESSIONE> -dNOPAUSE -dQUIET -dBATCH -sOutputFile=<OUTPUT-FILE> <INPUT-FILE>

All’interno del comando devi sostituire:

  • <LIVELLO-COMPRESSIONE> rappresenta la qualità (e quindi la dimensione) del file finale. Sono ammessi i valori:
    • /screen minima qualità
    • /ebook qualità media
    • /printer buona qualità
    • /prepress massima qualità
  • <OUTPUT-FILE> è il nome del file compresso prodotto dal comando
  • <INPUT-FILE> è il nome del file da comprimere

PS: per avere più informazioni su tutti i possibili parametri di GhostScript ti basta digitare sul terminale man gs

Quindi per ottenere un buon rapporto qualità/peso ho deciso di utilizzare il livello di compressione /ebook tramite il seguente comando:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=documenti-ebook.pdf documenti.pdf

Statistiche

Utilizzando un documento da 11,6MB come prova ho ottenuto i seguenti risultati:

  • 536,5kB a qualità screen
  • 1,4MB in qualità ebook
  • 11,6MB in qualità printer
  • 11,6MB in qualità prepress

Come puoi vedere gli ultimi due livelli di compressione non hanno cambiato la dimensione del file ottenuto. Questo vuol dire che di default l’applicazione dello scanner utilizza printer come livello di compressione.

PDF ottenuti utilizzando i vari livelli di compressione
PDF ottenuti utilizzando i vari livelli di compressione

Se questo post ti è stato utile puoi farmelo sapere lasciando un commento qui sotto oppure scrivendomi direttamente a t.me/lorenzomillucci.
Inoltre ti invito ad iscriverti al mio canale Telegram e a seguirmi su Twitter per non perderti nemmeno un post del mio blog. A presto!

Fonte

Software engineer presso Slope.
Appassionato di videogame, nel tempo libero mi diletto a scrivere su questo blog.
Per non perderti nemmeno un post puoi seguirmi su Telegram!

Aumentare il font-size di GRUB su schermi HiDPI

GRUB con font troppo piccolo

Gli schermi HighDPI sono ormai la norma per un ampia gamma di dispositivi. Grazie ad una maggiore densità dei pixel dello schermo è impossibile per l’occhio umano distinguere un pixel dall’altro incrementando notevolmente la qualità del testo e delle immagini mostrate.

Questo costante incremento della densità di pixel però ha come effetto collaterale il fatto che alcuni software necessitano di ottimizzazioni all’interfaccia grafica per evitare che la diminuzione della dimensione dei pixel riduca eccessivamente la dimensione degli elementi mostrati.

Uno dei software che risulta illeggibile sul mio Dell XPS a causa della dimensione microscopica del testo è il bootloader predefinito di Ubuntu: GRUB.

Fortunatamente per correggere questo problema è sufficiente modificare la dimensione del font utilizzato da GRUB.

Aggiungere il font alla partizione di boot

La prima cosa da fare è convertire il font da utilizzare in un formato (PFF2 font format) che GRUB sia in grado di impiegare all’avvio del sistema tramite il programma grub-mkfont.

sudo grub-mkfont --output=/boot/grub/fonts/DejaVuSansMono24.pf2 --size=24 /usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf

NOTA: in questo caso ho scelto di utilizzare il font DejaVuSansMono ma è possibile utilizzare uno qualunque dei font installati nel sistema. (Ad esempio potresti usare il font predefinito di Ubuntu /usr/share/fonts/truetype/ubuntu/UbuntuMono-R.ttf)
Nel mio caso ho scelto una dimensione del font pari a 24 ma puoi scegliere quella che meglio si adatta al tuo sistema.
Anche il nome del font di output può essere scelto liberamente ma in questo caso per chiarezza ho scelto di usare le convenzione: nome del font + dimensione.

Aggiungere il font alla configurazione di GRUB

Una volta che il font è stato convertito in un formato compatibile con GRUB è necessario modificare la configurazione in modo che venga utilizzato al posto di quello predefinito.
Per farlo bisogna aggiungere la riga GRUB_FONT=<path_font_da_utilizzare> al file /etc/default/grub con il comando:

sudo nano /etc/default/grub
Modifica del file /etc/default/grub
Modifica del file /etc/default/grub

Una volta terminate le modifiche bisogna fare in modo che siano applicate con il comando sudo update-grub.
A questo punto non resta che riavviare il sistema per vedere le modifiche applicate.

GRUB finalmente con testo leggibile

Se questo post ti è stato utile puoi farmelo sapere lasciando un commento qui sotto oppure scrivendomi direttamente a t.me/lorenzomillucci.
Inoltre ti invito ad iscriverti al mio canale Telegram e a seguirmi su Twitter per non perderti nemmeno un post del mio blog. A presto!

Fonte A
Fonte B

Software engineer presso Slope.
Appassionato di videogame, nel tempo libero mi diletto a scrivere su questo blog.
Per non perderti nemmeno un post puoi seguirmi su Telegram!

Firefox: Installare un certificato SSL self-signed da Ubuntu

Attenzione: potenziale rischio per la sicurezza

NOTE: if you want, you can read this tutorial in English 🎉

NOTA: la guida funziona anche su Fedora!

Durante lo sviluppo di applicazioni web può capitare di avere la necessità di creare e di utilizzare dei certificati SSL self-signed e cioè che non sono firmati da nessuna delle autorità di certificazione riconosciute.
In questi casi i browser mostrano un messaggio d’errore che avverte l’utente del fatto che il sito a cui si sta connettendo non ha un certificato riconosciuto e che questo potrebbe rappresentare un potenziale rischio per la sicurezza.

Per evitare che ad ogni connessione venga mostrato l’avviso di sicurezza è necessario fare in modo che il browser riconosca il nostro certificato come valido.

In questo post ti spiegherò come aggiungere (ed eventualmente rimuovere) un certificato SSL all’archivio utilizzato da Firefox in modo da non ricevere più alcun avviso di sicurezza dal browser.

NOTA: se utilizzi anche Google Chrome ricordati di seguire la procedura per aggiungere un certificato anche li.

Identificare la cartella con il profilo di Firefox

Quando utilizzi Firefox ogni modifica alle impostazioni, ai preferiti o alle estensioni viene memorizzata all’interno di una cartella speciale chiamata profile.
All’interno di questa cartella è custodito anche il database dei certificati considerati attendibili dal browser per cui, per poterne aggiungere uno, la prima cosa da fare è individuare la cartella in cui è memorizzato il tuo profilo.

Per farlo ti basta aprire Firefox e digitare nella barra degli indirizzi:

about:profiles
Pagina about:profiles di Firefox
about:profiles di Firefox

Il percorso del profilo è quello indicato dalla label Cartella radice(o Root Directory in inglese).

Ad esempio, nel mio caso il profilo si trova nella cartella: /home/lorenzo/.mozilla/firefox/s9kh79z8.default

Aggiungere il certificato

Per poter aggiungere un certificato SSL a Firefox è necessario installare il tool certutil.
Per installarlo puoi usare il seguente comando da terminale:

sudo apt install libnss3-tools

NOTA: a seconda della versione del sistema operativo questo pacchetto potrebbe essere già incluso all’interno della distribuzione in uso.

Una volta terminata l’installazione, per aggiungere un certificato ti basta utilizzare il seguente comando:

certutil -A -n "<CERT_NICKNAME>" -t "TC,," -i <PATH_FILE_CRT> -d sql:<PATH_PROFILO_FIREFOX>

Dove:

  • CERT_NICKNAME: indica l’alias da utilizzare per riconoscere il certificato nella lista di quelli installati
  • PATH_FILE_CRT: indica il path del file .crt da importare
  • PATH_PROFILO_FIREFOX: indica il path del profilo utilizzato su Firefox (individuato al punto precedente)

NOTA: Per sapere cosa significano i trustargs (la parte dopo il -t) puoi consultare la documentazione ufficiale.

Ad esempio nel mio caso il comando precedente si traduce in:

certutil -A -n "slope" -t "TC,," -i ~/Downloads/slope.crt -d sql:/home/lorenzo/.mozilla/firefox/s9kh79z8.default 

Verificare i certificati installati

Per verificare che il comando di aggiunta del certificato sia andato a buon fine o più in generale per visualizzare i certificati installati, puoi utilizzare il seguente comando:

 certutil -d sql:<PATH_PROFILO_FIREFOX> -L      

Rimuovere un certificato

Nel caso in cui tu abbia bisogno di rimuovere un certificato installato ti basta conoscere il suo nickname (che puoi vedere con il comando precedente) e digitare:

certutil  -D -n "<CERT_NICKNAME>"  -d sql:<PATH_PROFILO_FIREFOX>    

Conclusioni

Se questo post ti è stato utile puoi farmelo sapere lasciando un commento qui sotto oppure scrivendomi direttamente a t.me/lorenzomillucci.
Inoltre ti invito ad iscriverti al mio canale Telegram e a seguirmi su Twitter per non perderti nemmeno un post del mio blog. A presto!

Software engineer presso Slope.
Appassionato di videogame, nel tempo libero mi diletto a scrivere su questo blog.
Per non perderti nemmeno un post puoi seguirmi su Telegram!

Impossibile aggiornare Ubuntu 16.04 alla release 18.04

Lo ammetto: in passato ho sempre avuto esperienze terribili con l’avanzamento di versione di Ubuntu per cui preferisco sempre aggiornare eseguendo un’installazione pulita.

Questa volta però non avevo proprio voglia di fare tutta la trafila necessaria a riconfigurare un nuovo sistema operativo da capo. Dovendo passare da una LTS alla successiva ed essendo il PC in questione utilizzato principalmente per la navigazione Internet ho deciso di tentare la sorte ed eseguire l’upgrade da Ubuntu 16.04 ad Ubuntu 18.04.

E’ andato tutto liscio? Non proprio…

Il problema

Mi appresto ad avviare l’aggiornamento all’ultima release rigorosamente da terminale tramite il comando:

sudo do-release-upgrade

Nel terminale le scritte cominciano a scorrere ed io attendo fiducioso che il processo mi chieda la conferma per l’installazione del nuovo aggiornamento… e invece compare il messaggio Ripristino dello stato originale del sistema

Verifica un nuovo rilascio di ubuntu
Scaricamento di:1 Firma dello strumento di avanzamento versione [819 B]        
Scaricamento di:2 Strumento di avanzamento versione [1.242 kB]                 
Recuperati 1.243 kB in 0s (0 B/s)                                              
autenticazione di «bionic.tar.gz» con «bionic.tar.gz.gpg» 
estrazione di «bionic.tar.gz»

Lettura della cache

Controllo gestore dei pacchetti
Lettura elenco dei pacchetti... Fatto
Generazione albero delle dipendenze        
Lettura informazioni sullo stato... Fatto 
Trovato http://it.archive.ubuntu.com/ubuntu xenial InRelease                   
Trovato http://it.archive.ubuntu.com/ubuntu xenial-updates InRelease           
Scaricamento di:1 http://security.ubuntu.com/ubuntu xenial-security InRelease [109 kB]
Trovato http://it.archive.ubuntu.com/ubuntu xenial-backports InRelease         
Recuperati 109 kB in 0s (0 B/s)                                                
Lettura elenco dei pacchetti... Fatto     
Generazione albero delle dipendenze        
Lettura informazioni sullo stato... Fatto 

Ripristino dello stato originale del sistema

Interruzione
Lettura elenco dei pacchetti... Fatto     
Generazione albero delle dipendenze        
Lettura informazioni sullo stato... Fatto 

Cosa diavolo può essere andato storto? E’ vero che è una vecchia versione di Ubuntu ma è anche vero che a parte 4-5 programmi non c’è quasi nulla di installato.
Un po’ sfiduciato allora decido di provare a vedere se nei log c’è qualche informazione utile che mi aiuti a capire cosa è andato storto.
Apro il file /var/log/dist-upgrade/DATA_TENTATIVO_UPGRADE/main.log e leggo:

2019-11-30 11:00:49,902 INFO Using config files '['./DistUpgrade.cfg.xenial']'
2019-11-30 11:00:49,903 INFO uname information: 'Linux lorenzo-Lenovo-G580 4.15.0-70-generic #79~16.04.1-Ubuntu SMP Tue Nov 12 14:01:10 UTC 2019 x86_64'
2019-11-30 11:00:50,269 INFO apt version: '1.2.32'
2019-11-30 11:00:50,269 INFO python version: '3.5.2 (default, Oct  8 2019, 13:06:37) 
[GCC 5.4.0 20160609]'
2019-11-30 11:00:50,273 INFO release-upgrader version '18.04.36' started
2019-11-30 11:00:50,283 INFO locale: 'it_IT' 'UTF-8'
2019-11-30 11:00:50,347 INFO screen could not be run
2019-11-30 11:00:50,537 DEBUG Using 'DistUpgradeViewText' view
2019-11-30 11:00:50,596 DEBUG enable dpkg --force-overwrite
2019-11-30 11:00:50,635 DEBUG creating statefile: '/var/log/dist-upgrade/apt-clone_system_state.tar.gz'
2019-11-30 11:00:55,723 DEBUG lsb-release: 'xenial'
2019-11-30 11:00:55,724 DEBUG _pythonSymlinkCheck run
2019-11-30 11:00:55,726 DEBUG openCache()
2019-11-30 11:00:55,726 DEBUG No such plugin directory: ./plugins
2019-11-30 11:00:55,726 DEBUG plugins for condition 'PreCacheOpen' are '[]'
2019-11-30 11:00:55,726 DEBUG plugins for condition 'bionicPreCacheOpen' are '[]'
2019-11-30 11:00:55,726 DEBUG plugins for condition 'from_xenialPreCacheOpen' are '[]'
2019-11-30 11:00:55,727 DEBUG quirks: running PreCacheOpen
2019-11-30 11:00:55,727 DEBUG running Quirks.PreCacheOpen
2019-11-30 11:00:56,354 DEBUG /openCache(), new cache size 90197
2019-11-30 11:00:56,354 DEBUG need_server_mode(): run in 'desktop' mode, (because of pkg 'ubuntu-desktop')
2019-11-30 11:00:56,354 DEBUG checkViewDepends()
2019-11-30 11:00:56,355 DEBUG running doUpdate() (showErrors=False)
2019-11-30 11:00:57,702 DEBUG openCache()
2019-11-30 11:00:58,373 DEBUG /openCache(), new cache size 90197
2019-11-30 11:00:58,373 DEBUG doPostInitialUpdate
2019-11-30 11:00:58,373 DEBUG plugins for condition 'PostInitialUpdate' are '[]'
2019-11-30 11:00:58,373 DEBUG plugins for condition 'bionicPostInitialUpdate' are '[]'
2019-11-30 11:00:58,373 DEBUG plugins for condition 'from_xenialPostInitialUpdate' are '[]'
2019-11-30 11:00:58,373 DEBUG quirks: running bionicPostInitialUpdate
2019-11-30 11:00:58,374 DEBUG running Quirks.bionicPostInitialUpdate
2019-11-30 11:01:03,393 DEBUG abort called
2019-11-30 11:01:03,394 DEBUG openCache()
2019-11-30 11:01:04,067 DEBUG /openCache(), new cache size 90197

Il problema sembra essere causato dopo che viene registrato running Quirks.bionicPostInitialUpdate.

Vuoi vedere che alla fine mi conveniva davvero fare un installazione pulita anche questa volta?

Decido di non darmi per vinto e provare a cercare su Google una possibile soluzione al problema.

Tra i vari risultati trovo una segnalazione di un bug di Ubuntu in cui viene indicato come colpevole snapd.

Provo a verificare se nel mio sistema il servizio snapd sia avviato correttamente con il comando:

sudo service snapd status

e a quanto pare effettivamente sembra esserci un problema:

nov 30 10:53:00 lorenzo-Lenovo-G580 systemd[1]: snapd.service: Failed with resul
nov 30 10:53:01 lorenzo-Lenovo-G580 systemd[1]: snapd.service: Service hold-off 
nov 30 10:53:01 lorenzo-Lenovo-G580 systemd[1]: Stopped Snappy daemon.
nov 30 10:53:01 lorenzo-Lenovo-G580 systemd[1]: snapd.service: Start request rep
nov 30 10:53:01 lorenzo-Lenovo-G580 systemd[1]: Failed to start Snappy daemon.
nov 30 10:53:01 lorenzo-Lenovo-G580 systemd[1]: snapd.service: Unit entered fail
nov 30 10:53:01 lorenzo-Lenovo-G580 systemd[1]: snapd.service: Triggering OnFail
nov 30 10:53:01 lorenzo-Lenovo-G580 systemd[1]: snapd.service: Failed with resul
nov 30 11:04:11 lorenzo-Lenovo-G580 systemd[1]: Stopped Snappy daemon.

La soluzione

Apparentemente il colpevole è il servizio snapd di Ubuntu che avendo qualche problema impedisce l’avanzamento di versione.
Decido quindi di tagliare la testa al toro e di provare una rimozione e reinstallazione del servizio con i comandi:

sudo apt purge snapd && sudo apt install snapd

Infine, rilanciando l’installazione con il comando sudo do-release-upgrade, l’installazione della nuova versione inizia correttamente e riesce a completarsi con successo.
Questo post è stato scritto direttamente dal PC appena aggiornato ad Ubuntu 18.04 🙂

Se questo post ti è stato utile puoi farmelo sapere lasciando un commento qui sotto oppure scrivendomi direttamente a t.me/lorenzomillucci.
Inoltre ti invito ad iscriverti al mio canale Telegram e a seguirmi su Twitter per non perderti nemmeno un post del mio blog. A presto!

Software engineer presso Slope.
Appassionato di videogame, nel tempo libero mi diletto a scrivere su questo blog.
Per non perderti nemmeno un post puoi seguirmi su Telegram!

Installare Python 3.8 su Ubuntu 18.04

NOTA: Ubuntu 20.04 offre di default Python 3.8. Se stai usando l’ultima LTS di Ubuntu questa guida non è più necessaria.

UPDATE: è disponibile Python 3.9 e quindi un nuovo articolo per installarlo su Ubuntu 20.04 🙂


E’ stato da poco rilasciata la versione 3.8 di Python! 🎉

Per sapere le novità introdotte dal nuovo update ti lascio il link all’articolo ufficiale della documentazione.

In questo post ti mostro come installarlo subito su Ubuntu 18.04 sfruttando un PPA aggiuntivo.

Installazione

Per installare subito l’ultimissima versione di python sul tuo sistema apri il terminale e digita i seguenti comandi:

sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.8

NOTA: dallo stesso repository puoi scaricare anche le versioni 3.1, 3.5 e 3.7 di python (la versione 3.6 è quella fornita di default da Ubuntu)

Non appena l’installazione sarà finita potrai utilizzare la nuovissima versione di python utilizzando il comando python3.8

Python 3.8 installato
Python 3.8 installato

Conclusioni

Se questo post ti è stato utile puoi farmelo sapere con un commento qui sotto oppure scrivendomi direttamente a t.me/lorenzomillucci.
Inoltre ti invito ad iscriverti al mio canale Telegram e a seguirmi su Twitter per non perderti nemmeno un post del mio blog. A presto!

Software engineer presso Slope.
Appassionato di videogame, nel tempo libero mi diletto a scrivere su questo blog.
Per non perderti nemmeno un post puoi seguirmi su Telegram!