2016-11-02 195 views
0

我正在使用iTextSharp将PDF文档合并在一起。我的问题是我想合并一个包含书签的大型PDF。我目前的功能是使用PdfWriter来合并文档。我知道PdfStamper会工作,但我无法弄清楚如何改变功能正常工作。itextsharp从pdfwriter更改为pdfstamper以保留PDF中的书签

当我在下面的示例中将PdfWriter更改为PdfStamper时,出现错误。

代码示例:

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

错误消息:

'的GetInstance' 不是 'iTextSharp.text.pdf.PdfStamper'

这里是一个整体构件功能:

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 

回答

1

您不能只是将PdfWriter更改为PdfStamper。您neex创建与读者压模和输出流:

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

如果使用PdfStamper你并不需要一个Document实例;您只需要更仔细阅读文档。

上述一切是你没用,因为PdfStamper是当你操纵单个文件使用类。如果要合并不同的文件,你需要使用PdfCopyPdfSmartCopy

请大家看看ConcatenateBookmarks例子。如果您不了解Java,那么页面底部会有一个C#示例。

浏览官方网站的iText如果您还有其他问题。