2016-11-02 3 views
0

J'utilise iTextSharp pour fusionner des documents PDF ensemble. Mon problème est que j'essaye de fusionner un grand pdf qui contient des signets. Ma fonction actuelle utilise PdfWriter pour fusionner les documents. Je sais que PdfStamper fonctionnera, mais je n'arrive pas à comprendre comment changer la fonction pour fonctionner correctement.itextsharp passer de pdfwriter à pdfstamper pour conserver les signets en PDF

Lorsque je change PdfWriter en PdfStamper dans l'exemple ci-dessous, j'obtiens une erreur.

Exemple de code:

writer = PdfStamper.GetInstance(pdfDoc, New FileStream(outputPath, FileMode.OpenOrCreate)) 

Message d'erreur:

'GetInstance' est pas un membre de 'iTextSharp.text.pdf.PdfStamper'

est ici l'ensemble Fonction:

Public Shared Function MergePdfFiles(ByVal pdfFiles() As String, ByVal outputPath As String) As Boolean 
    Dim result As Boolean = False 
    Dim pdfCount As Integer = 0  
    Dim f As Integer = 0  
    Dim fName As String 
    Dim reader As iTextSharp.text.pdf.PdfReader = Nothing 
    Dim pageCount As Integer = 0 
    Dim pdfDoc As iTextSharp.text.Document = Nothing  
    Dim writer As PdfWriter = Nothing 
    Dim cb As PdfContentByte = Nothing 

    Dim page As PdfImportedPage = Nothing 
    Dim rotation As Integer = 0 

    Try 
     pdfCount = pdfFiles.Length 
     If pdfCount > 1 Then 
      fName = pdfFiles(f) 
      reader = New iTextSharp.text.pdf.PdfReader(fName) 
      pageCount = reader.NumberOfPages 

      pdfDoc = New iTextSharp.text.Document(reader.GetPageSizeWithRotation(1), 18, 18, 18, 18) 

      writer = PdfWriter.GetInstance(pdfDoc, New FileStream(outputPath, FileMode.OpenOrCreate)) 

      With pdfDoc 
       .Open() 
      End With 
      cb = writer.DirectContent 
      While f < pdfCount 
       Dim i As Integer = 0 
       While i < pageCount 
        i += 1 
        pdfDoc.SetPageSize(reader.GetPageSizeWithRotation(i)) 
        pdfDoc.NewPage() 
        page = writer.GetImportedPage(reader, i) 
        rotation = reader.GetPageRotation(i) 
        If rotation = 90 Then 
         cb.AddTemplate(page, 0, -1.0F, 1.0F, 0, 0, reader.GetPageSizeWithRotation(i).Height) 
        ElseIf rotation = 270 Then 
         cb.AddTemplate(page, 0, 1.0F, -1.0F, 0, reader.GetPageSizeWithRotation(i).Width + 60, -30) 
        Else 
         cb.AddTemplate(page, 1.0F, 0, 0, 1.0F, 0, 0) 
        End If 
       End While 
       f += 1 
       If f < pdfCount Then 
        fName = pdfFiles(f) 
        reader = New iTextSharp.text.pdf.PdfReader(fName) 
        pageCount = reader.NumberOfPages 
       End If 
      End While 
      pdfDoc.Close() 
      result = True 
     End If 
    Catch ex As Exception 
     MessageBox.Show(ex.Message) 
     Return False 
    End Try 
    Return result 
End Function 

Répondre

1

Vous ne pouvez pas simplement changer PdfWriter à PdfStamper. Vous neex pour créer un Stamper avec un lecteur et un flux de sortie:

PdfReader reader = new PdfReader(pathToSrc); 
PdfStamper.GetInstance(reader, New FileStream(outputPath, FileMode.OpenOrCreate)); 
// do stuff 
stamper.Close(); 

Vous n'avez pas besoin d'une instance Document si vous utilisez PdfStamper; il suffit de lire la documentation de plus près.

Tout ce qui précède est inutile pour vous, car PdfStamper est la classe à utiliser lorsque vous manipulez un seul fichier. Si vous souhaitez fusionner un fichier différent, vous devez utiliser PdfCopy ou PdfSmartCopy.

Veuillez jeter un oeil à l'exemple ConcatenateBookmarks. Il y a un exemple C# en bas de la page si vous ne comprenez pas Java. Consultez le site officiel d'iText si vous avez d'autres questions.