Questa pagina può contenere testo tradotto automaticamente.

Dividi documenti PDF in C# e VB.NET

Libreria Docotic.Pdf consente di dividere un documento PDF in un gruppo di file più piccoli. Puoi estrarre singole pagine o intervalli di pagine. Puoi anche dividere i documenti PDF in base a determinati criteri.

Dividi documenti PDF

Docotic.Pdf viene fornito con licenze a pagamento, ma è anche gratuito in alcuni casi. Ottieni la libreria e una chiave di licenza gratuita a tempo limitato sulla pagina Scarica la libreria PDF C# .NET.

Libreria Docotic.Pdf 9.5.17548-dev Test di regressione Ne sono passati 14,726 Download totali di NuGet 4,514,921

Nozioni di base sulla divisione dei PDF

I metodi PdfDocument.CopyPages consentono di copiare pagine da oggetti PdfDocument. Questa è l'API Docotic.Pdf principale per dividere i documenti PDF.

Dividi PDF in singole pagine

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 caratteri, immagini e motivi non utilizzati. Maggiori informazioni sulla compressione PDF nella sezione Ottimizza file di output.

Dividi in gruppi di pagine

Il metodo CopyPages supporta la copia di qualsiasi intervallo di pagine. Questo snippet di codice mostra come estrarre la terza e la prima pagina:

using var pdf = new PdfDocument(@"source.pdf");

using PdfDocument copy = pdf.CopyPages(new int[] { 2, 0 });
copy.RemoveUnusedResources();
copy.Save("result.pdf");

L'ordine degli indici delle pagine è importante. Definisce l'ordine delle pagine nel documento risultante.

Prova l'esempio di codice Copia pagine da GitHub.

Dividi PDF in base alla condizione

Puoi dividere i documenti in base al contenuto. Ciò è utile se non sai in anticipo quali pagine estrarre. Ad esempio, estrai pagine contenenti 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 ulteriori informazioni sull'estrazione del testo nell'articolo Estrai testo da PDF in C# e VB.NET.

Suddivisione avanzata dei PDF

Estrai pagine

I metodi CopyPages non modificano l'oggetto PdfDocument associato. Esistono anche i metodi PdfDocument.ExtractPages. Permettono 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 l'esempio di codice Estrai pagine corrispondente da GitHub.

Rimuovere e riordinare le pagine

I metodi CopyPages e 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")

Puoi anche riordinare le pagine dopo la rimozione. Guarda gli esempi di codice correlati:

Ottimizza i file di output

In precedenza, ho utilizzato il metodo RemoveUnusedResources per ottimizzare i file risultanti. Docotic.Pdf fornisce più opzioni per la compressione PDF. Ad esempio, puoi rimuovere le informazioni sulla struttura o comprimere le immagini. Leggi l'articolo Comprimi documenti PDF in C# e VB.NET per ulteriori informazioni. Puoi anche provare l'esempio di codice Comprimi il documento PDF in .NET da GitHub.

La suddivisione del PDF viene talvolta utilizzata per ottenere file di pagina più piccoli di un certo limite. In questi casi, puoi misurare la dimensione risultante e comprimere il file se necessario. Codice d'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);

byte limit = 1024 * 1024;
if (ms.Length > limit)
{
    compress(copy);
    copy.Save("result.pdf");
}

Tieni presente che potrebbe essere impossibile comprimere un file PDF al di sotto di un certo limite. I risultati dipendono dal contenuto del file e dal valore limite.

Estrai il contenuto della pagina

È anche possibile modificare il contenuto della pagina durante la divisione. Ad esempio, è possibile ridimensionare le pagine estratte prima di utilizzarle in un'imposizione PDF. Prova il progetto di esempio Crea XObject dalla pagina correlato da GitHub.

Oppure puoi rimuovere o sostituire alcuni contenuti sulle pagine estratte. Guarda l'esempio di codice Copia testo, percorsi e immagini che mostra come copiare gli oggetti della pagina PDF.

Dividi PDF in immagini

Docotic.Pdf ti consente anche di dividere il documento PDF in immagini di pagina. Leggi l'articolo Converti PDF in immagini in C# e VB.NET per maggiori dettagli.

Diviso in fili paralleli

Potresti voler parallelizzare la suddivisione del PDF per documenti di grandi dimensioni. La classe PdfDocument non è thread-safe. Ma è possibile utilizzare 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");
});

Tieni presente che il codice a thread singolo è solitamente più veloce. La soluzione multi-thread comporta un sovraccarico relativo all'analisi di oggetti PdfDocument aggiuntivi. Utilizzare la versione a thread singolo a meno che i test non dimostrino che un codice parallelo è più veloce.