Introduzione

In questo post, imparerai come eseguire le operazioni core di gestione dei documenti PDF in Go utilizzando Aspose.PDF FOSS: aprire e salvare i documenti, creare nuovi PDF, suddividere un documento in file per pagina, unire più PDF, estrarre intervalli di pagine e leggere o scrivere i metadati del documento. Tutte le operazioni sono disponibili senza alcuna dipendenza nativa C o C++.

La libreria è un modulo Go disponibile su github.com/aspose-pdf-foss/aspose-pdf-foss-for-go, con licenza MIT, e richiede Go 1.24 o versioni successive.

go get github.com/aspose-pdf-foss/aspose-pdf-foss-for-go

Questo post copre i tipi Document, Page, PageRange e DocumentInfo che costituiscono la superficie core della gestione dei documenti.


Operazioni Core

Apertura e Salvataggio dei Documenti

pdf.Open carica un PDF dal disco e restituisce un *Document. OpenWithPassword fa lo stesso per i file protetti da password. Document.Save scrive il risultato di nuovo in un percorso file. Document.WriteTo scrive in un io.Writer per scenari in memoria o di rete.

// Open a standard PDF
doc, err := pdf.Open("input.pdf")
if err != nil {
	panic(err)
}

// Open an encrypted PDF
protected, err := pdf.OpenWithPassword("locked.pdf", "userpassword")
if err != nil {
	panic(err)
}

// Save to a new path
err = doc.Save("output.pdf")
fmt.Println(protected.PageCount())

Creare un nuovo documento

pdf.NewDocument crea un *Document vuoto. Usa AddBlankPageFromFormat per aggiungere una pagina vuota con una dimensione carta standard. PageFormat fornisce costanti di formato nominate (PageFormatA4, PageFormatLetter, ecc.).

doc := pdf.NewDocumentFromFormat(pdf.PageFormatA4)

doc.Save("new_document.pdf")

Dividere un documento

Document.Split divide un PDF in valori *Document individuali per pagina. Ogni documento restituito contiene esattamente una pagina e può essere salvato in modo indipendente. Questo è utile per suddividere report generati in batch o per separare le pagine delle fatture.

doc, _ := pdf.Open("multi_page.pdf")
pages, err := doc.Split()
if err != nil {
	panic(err)
}

for i, p := range pages {
	filename := fmt.Sprintf("page_%03d.pdf", i+1)
	if err := p.Save(filename); err != nil {
		fmt.Printf("Failed to save page %d: %v\n", i+1, err)
	}
}
fmt.Printf("Split into %d pages\n", len(pages))

Unire più PDF

Document.Append unisce un secondo *Document nel destinatario in loco, aggiungendo tutte le pagine dalla sorgente. Chiama Append ripetutamente per concatenare più documenti prima di un unico Save. Il documento di origine non viene modificato.

base, _ := pdf.Open("report_intro.pdf")
section1, _ := pdf.Open("section1.pdf")
section2, _ := pdf.Open("section2.pdf")
appendix, _ := pdf.Open("appendix.pdf")

base.Append(section1)
base.Append(section2)
base.Append(appendix)

base.Save("complete_report.pdf")

Estrarre un intervallo di pagine

PageRange rappresenta un intervallo inclusivo (basato su 1, usando i campi From/To). Passa gli intervalli a Document.Extract per produrre un nuovo *Document contenente solo le pagine selezionate. Questo è utile per creare esportazioni per capitolo o copie redatte che omettono alcune pagine.

doc, _ := pdf.Open("long_report.pdf")

// Extract pages 3 through 7
subset, err := doc.Extract(pdf.PageRange{From: 3, To: 7})
if err != nil {
	panic(err)
}
subset.Save("pages_3_to_7.pdf")

Lettura e scrittura dei metadati del documento

Document.Info restituisce una struct DocumentInfo che espone i campi del dizionario Info: Title, Author, Subject, Keywords, Creator, Producer, CreationDate e ModDate. Modifica i campi direttamente, quindi chiama Document.SetInfo per scrivere la struct aggiornata prima di chiamare Save.

doc, _ := pdf.Open("report.pdf")
info, _ := doc.Info()

// Read current values
fmt.Printf("Title: %s\nAuthor: %s\n", info.Title, info.Author)

// Update fields
info.Title = "Annual Report 2026"
info.Author = "Finance Team"
info.Keywords = "annual, report, finance, 2026"

doc.SetInfo(info)
doc.Save("report_updated.pdf")

Accesso alle singole pagine

Document.Page(n) recupera un *Page tramite indice basato su 1. Document.PageCount restituisce il numero totale di pagine. Le pagine espongono proprietà geometriche per leggere le box delle pagine e le dimensioni.

doc, _ := pdf.Open("document.pdf")
fmt.Printf("Page count: %d\n", doc.PageCount())

page, _ := doc.Page(1)
size, err := page.Size()
if err != nil {
	panic(err)
}
fmt.Printf("Page 1 size: %.0f x %.0f pt\n", size.Width, size.Height)

Avvio rapido

Installa il modulo con go get, poi esegui l’esempio completo qui sotto. L’esempio apre un documento sorgente, estrae le sue prime tre pagine in un nuovo documento, aggiorna i campi di metadati DocumentInfo e salva il risultato su disco.

go get github.com/aspose-pdf-foss/aspose-pdf-foss-for-go

Un esempio completo che apre un documento, estrae le pagine 1–3 e salva il risultato con i metadati aggiornati:

package main

import (
	"fmt"
	pdf "github.com/aspose-pdf-foss/aspose-pdf-foss-for-go"
)

func main() {
	// Open source document
	src, err := pdf.Open("source.pdf")
	if err != nil {
		panic(err)
	}

	// Extract pages 1-3
	subset, err := src.Extract(pdf.PageRange{From: 1, To: 3})
	if err != nil {
		panic(err)
	}

	// Update metadata
	info, _ := subset.Info()
	info.Title = "Pages 1-3 Extract"
	info.Author = "Document Pipeline"
	subset.SetInfo(info)

	if err := subset.Save("extract_pages_1_3.pdf"); err != nil {
		panic(err)
	}
	fmt.Printf("Saved %d pages\n", subset.PageCount())
}

Open Source e Licenze

Aspose.PDF FOSS per Go è rilasciato sotto licenza MIT. Non ci sono restrizioni d’uso, né costi di runtime, né requisiti di registrazione. Il codice sorgente è disponibile su github.com/aspose-pdf-foss/aspose-pdf-foss-for-go.


Guida introduttiva

Risorse correlate