2011-07-11 5 views
5

Stiamo usando itextsharp per creare un singolo PDF da più file PDF. Come inserisco una nuova pagina in un file PDF che ha già più pagine nel file? Quando uso la pagina aggiungi, sovrascrive le pagine esistenti e salva solo la pagina 1 che è stata selezionata.Inserire la pagina nel PDF esistente utilizzando itextsharp

Ecco il codice che sto usando per aggiungere la pagina al PDF esistente:

PdfReader reader = new PdfReader(sourcePdfPath); 
       Document document = new Document(reader.GetPageSizeWithRotation(1)); 
       PdfCopy pdfCopy = new PdfCopy(document, new System.IO.FileStream(outputPdfPath, System.IO.FileMode.Create)); 
       MemoryStream memoryStream = new MemoryStream(); 
       PdfWriter writer = PdfWriter.GetInstance(document, memoryStream); 
       document.AddDocListener(writer); 
       document.Open(); 

       for (int p = 1; p <= reader.NumberOfPages; p++) 
       { 
        if (pagesToExtract.FindIndex(s => s == p) == -1) continue; 
        document.SetPageSize(reader.GetPageSize(p)); 
        document.NewPage(); 
        PdfContentByte cb = writer.DirectContent; 
        PdfImportedPage pageImport = writer.GetImportedPage(reader, p); 

        int rot = reader.GetPageRotation(p); 
        if (rot == 90 || rot == 270) 
        { 
         cb.AddTemplate(pageImport, 0, -1.0F, 1.0F, 0, 0, reader.GetPageSizeWithRotation(p).Height); 
        } 
        else 
        { 
         cb.AddTemplate(pageImport, 1.0F, 0, 0, 1.0F, 0, 0); 
        } 

        pdfCopy.AddPage(pageImport); 
       } 

       pdfCopy.Close(); 

risposta

1

Si potrebbe usare qualcosa come questo, in cui è la srcIEnumerable<string> di ingresso pdf nomi di file. Assicurati che il tuo file pdf esistente sia una di quelle fonti. La classe PdfConcatenate si trova nell'ultima versione di iTextSharp.

 
var result = "combined.pdf"; 
var fs = new FileStream(result, FileMode.Create); 
var conc = new PdfConcatenate(fs, true); 
foreach(var s in src) { 
    var r = new PdfReader(s); 
    conc.AddPages(r); 
} 
conc.Close(); 
+0

Sto cercando di ottenere solo alcune pagine da un PDF di origine e aggiungerli a un PDF esistente. L'unico problema è che non lo sta aggiungendo al PDF esistente ma solo sovrascrivendolo. –

+0

@Rob: per qualche motivo non ho capito dalla domanda originale. Il problema può essere riformulato come esigenza di combinare alcune (comprese tutte) pagine dai documenti di origine in un singolo file? Significa che un PDF esistente diventa una di quelle fonti con tutte le pagine richieste? –

2

PdfCopy è destinato all'uso con un vuoto Document. Dovresti aggiungere tutto ciò che vuoi, una pagina alla volta.

L'alternativa è utilizzare PdfStamper.InsertPage(pageNum, rectangle) e quindi tracciare un PdfImportedPage in quella nuova pagina.

Nota che PdfImportedPage include solo il contenuto della pagina, non le annotazioni o informazioni a livello di doc ("la struttura del documento", JavaScript a livello di documento, ecc) che pagina potrebbe essere originariamente utilizzato ... a meno che non si utilizza uno con PdfCopy.

Uno stamper potrebbe essere più efficiente e utilizzare meno codice, ma PdfCopy importerà tutte le informazioni a livello di pagina, non solo i contenuti della pagina.

Questo potrebbe essere importante, potrebbe non. Dipende dalla pagina che stai cercando di importare.

+0

Questa risposta funziona perfettamente nel mio caso! Avevo bisogno di aggiungere 'n' pagine bianche a un PDF esistente. 'PdfStamper.InsertPage' era il modo. Grazie! – Nicolocodev

3

Ho provato questo codice, e funziona per me, ma non dimenticate di fare alcune convalide di numero di pagine e l'esistenza dei percorsi che si utilizzano

ecco il codice:

private static void AppendToDocument(string sourcePdfPath, string outputPdfPath, List<int> neededPages) 
    { 

     var sourceDocumentStream = new FileStream(sourcePdfPath, FileMode.Open); 
     var destinationDocumentStream = new FileStream(outputPdfPath, FileMode.Create); 
     var pdfConcat = new PdfConcatenate(destinationDocumentStream); 

     var pdfReader = new PdfReader(sourceDocumentStream); 
     pdfReader.SelectPages(neededPages); 
     pdfConcat.AddPages(pdfReader); 

     pdfReader.Close(); 
     pdfConcat.Close(); 
    } 
5

Questo codice funziona. È necessario disporre di un file diverso per produrre i risultati.

private static void AppendToDocument(string sourcePdfPath1, string sourcePdfPath2, string outputPdfPath) 
{ 
    using (var sourceDocumentStream1 = new FileStream(sourcePdfPath1, FileMode.Open)) 
    { 
     using (var sourceDocumentStream2 = new FileStream(sourcePdfPath2, FileMode.Open)) 
     { 
      using (var destinationDocumentStream = new FileStream(outputPdfPath, FileMode.Create)) 
      { 
       var pdfConcat = new PdfConcatenate(destinationDocumentStream); 
       var pdfReader = new PdfReader(sourceDocumentStream1); 

       var pages = new List<int>(); 
       for (int i = 0; i < pdfReader.NumberOfPages; i++) 
       { 
        pages.Add(i); 
       } 

       pdfReader.SelectPages(pages); 
       pdfConcat.AddPages(pdfReader); 

       pdfReader = new PdfReader(sourceDocumentStream2); 

       pages = new List<int>(); 
       for (int i = 0; i < pdfReader.NumberOfPages; i++) 
       { 
        pages.Add(i); 
       } 

       pdfReader.SelectPages(pages); 
       pdfConcat.AddPages(pdfReader); 

       pdfReader.Close(); 
       pdfConcat.Close(); 
      } 
     } 
    } 
} 
+0

Questo codice funziona solo per correggere piccoli errori per (int i = 0; i

1

Aveva per uniformare il numero di pagine, con un multiplo di 4:

private static void AppendToDocument(string sourcePdfPath) 
{ 
    var tempFileLocation = Path.GetTempFileName(); 
    var bytes = File.ReadAllBytes(sourcePdfPath); 

    using (var reader = new PdfReader(bytes)) 
    { 
     var numberofPages = reader.NumberOfPages; 
     var modPages = (numberofPages % 4); 
     var pages = modPages == 0 ? 0 : 4 - modPages; 

     if (pages == 0) 
      return; 

     using (var fileStream = new FileStream(tempFileLocation, FileMode.Create, FileAccess.Write)) 
     { 
      using (var stamper = new PdfStamper(reader, fileStream)) 
      { 
       var rectangle = reader.GetPageSize(1); 
       for (var i = 1; i <= pages; i++) 
        stamper.InsertPage(numberofPages + i, rectangle); 
      } 
     } 
    } 

    File.Delete(sourcePdfPath); 
    File.Move(tempFileLocation, sourcePdfPath); 
}