Questa pagina può contenere testo tradotto automaticamente.
Suddividere documenti PDF in C# e VB.NET
La libreria Docotic.Pdf consente di dividere un documento PDF in un insieme di file più piccoli. È possibile estrarre singole pagine o intervalli di pagine. È anche possibile suddividere documenti PDF in base a determinati criteri.

Docotic.Pdf include licenze a pagamento, ma in alcuni casi è anche gratuito. Scarica la libreria e una chiave di licenza gratuita a tempo limitato nella pagina Scarica la libreria PDF C# .NET.
Nozioni di base sulla suddivisione dei PDF
I metodi PdfDocument.CopyPages consentono di copiare pagine dagli oggetti PdfDocument. Questa è l'API principale di Docotic.Pdf per suddividere documenti PDF.
Suddividere un PDF in pagine singole
Il seguente codice C# salva ogni pagina PDF in un file separato:
using var pdf = new PdfDocument("source.pdf");
for (int i = 0; i < pdf.PageCount; ++i)
{
using PdfDocument copy = pdf.CopyPages(i, 1);
copy.RemoveUnusedResources();
copy.Save(i + ".pdf");
}
Il metodo PdfDocument.RemoveUnusedResources aiuta a ridurre i file di output. È utile quando le pagine copiate fanno riferimento a font, immagini o pattern non usati. Per ulteriori informazioni sulla compressione dei PDF, vedere la sezione Ottimizzare i file di output.
Suddividere in gruppi di pagine
Il metodo CopyPages supporta la copia di qualsiasi intervallo di pagine. Questo frammento di codice mostra come estrarre la terza e la prima pagina:
using var pdf = new PdfDocument(@"source.pdf");
using PdfDocument copy = pdf.CopyPages([2, 0]);
copy.RemoveUnusedResources();
copy.Save("result.pdf");
L'ordine degli indici di pagina è importante. Definisce l'ordine delle pagine nel documento risultante.
Prova il codice di esempio Copia pagine da GitHub.
Suddividere il PDF in base a una condizione
È possibile suddividere i documenti in base al contenuto. Questo è utile se non si sa in anticipo quali pagine estrarre. Ad esempio, estrarre pagine contenenti un testo specifico:
string textToFind = ".NET Standard";
using var pdf = new PdfDocument("C# in depth.pdf");
var pageIndexes = new List<int>();
for (int i = 0; i < pdf.Pages.Count; i++)
{
string pageText = pdf.Pages[i].GetText();
if (pageText.Contains(textToFind, StringComparison.CurrentCultureIgnoreCase))
pageIndexes.Add(i);
}
if (pageIndexes.Count > 0)
{
using var copy = pdf.CopyPages(pageIndexes.ToArray());
copy.RemoveUnusedResources();
copy.Save(textToFind + ".pdf");
}
Puoi leggere di più sull'estrazione del testo nell'articolo Estrarre testo da PDF in C# e VB.NET.
Suddivisione avanzata dei PDF
Estrarre pagine
I metodi CopyPages non modificano l'oggetto PdfDocument associato. Esistono anche i metodi PdfDocument.ExtractPages. Consentono di rimuovere le pagine estratte dal documento:
using var pdf = new PdfDocument(@"source.pdf");
using PdfDocument copy = pdf.ExtractPages(0, 3);
copy.Save("extracted.pdf");
pdf.Save("original.pdf");
Puoi provare il corrispondente codice di esempio Estrai pagine da GitHub.
Rimuovere e riordinare le pagine
I metodi CopyPages ed ExtractPages producono un nuovo documento con le pagine selezionate. Un'alternativa è rimuovere le pagine da un documento corrente:
using var pdf = new PdfDocument(@"source.pdf");
pdf.RemovePages(0, 3);
pdf.Save("remaining.pdf");
È anche possibile riordinare le pagine dopo la rimozione. Guarda i codici di esempio in queste sezioni:
Ottimizzare i file di output
In precedenza ho usato il metodo RemoveUnusedResources per ottimizzare i file risultanti. Docotic.Pdf offre più opzioni per la compressione dei PDF. Ad esempio, è possibile rimuovere le informazioni di struttura o comprimere le immagini. Leggi l'articolo Comprimi documenti PDF in C# e VB.NET per ulteriori informazioni. Puoi anche provare il codice di esempio Comprimi il documento PDF in .NET da GitHub.
La suddivisione dei PDF viene talvolta usata per ottenere file di pagina più piccoli di un certo limite. In questi casi, è possibile misurare la dimensione risultante e comprimere il file, se necessario. Codice di esempio:
using var pdf = new PdfDocument("source.pdf");
using PdfDocument copy = pdf.CopyPages(0, 1);
copy.RemoveUnusedResources();
using var ms = new MemoryStream();
copy.Save(ms);
var limit = 1024 * 1024;
if (ms.Length > limit)
{
compress(copy);
copy.Save("result.pdf");
}
Nota che potrebbe essere impossibile comprimere un file PDF al di sotto di un determinato limite. I risultati dipendono dal contenuto del file e dal valore del limite.
Estrarre il contenuto della pagina
È anche possibile modificare il contenuto della pagina durante la suddivisione. Ad esempio, è possibile ridimensionare le pagine estratte prima di usarle in un'imposizione PDF. Prova il progetto di esempio correlato Crea XObject dalla pagina da GitHub.
Oppure puoi rimuovere o sostituire parte del contenuto nelle pagine estratte. Guarda il codice di esempio Copia testo, percorsi e immagini che mostra come copiare gli oggetti della pagina PDF.
Suddividere il PDF in immagini
Docotic.Pdf consente anche di suddividere un documento PDF in immagini di pagina. Leggi l'articolo Converti PDF in immagine in C# e VB.NET per maggiori dettagli.
Suddividere in thread paralleli
Potresti voler parallelizzare la suddivisione dei PDF per documenti di grandi dimensioni. La classe PdfDocument non è thread-safe. Tuttavia, è possibile usare oggetti PdfDocument separati in ogni thread:
string fileName = "source.pdf";
using var temp = new PdfDocument(fileName);
int pageCount = temp.PageCount;
Parallel.For(0, pageCount, i =>
{
using var pdf = new PdfDocument(fileName);
using var copy = pdf.CopyPages(i, 1);
copy.RemoveUnusedResources();
copy.Save($"split_{i}.pdf");
});
Nota che il codice a thread singolo è in genere più veloce. La soluzione multithread comporta un overhead legato all'analisi di oggetti PdfDocument aggiuntivi. Usa la versione a thread singolo, a meno che i test non dimostrino che il codice parallelo è più veloce.