我必须将多个PDF合并为一个PDF.
我正在使用iText.sharp库,并收集转换代码并尝试使用它(从here)
实际代码在C#中,我将其转换为VB.NET.
Private Function MergeFiles(ByVal sourceFiles As List(Of Byte())) As Byte() Dim mergedPdf As Byte() = Nothing Using ms As New MemoryStream() Using document As New Document() Using copy As New PdfCopy(document,ms) document.Open() For i As Integer = 0 To sourceFiles.Count - 1 Dim reader As New PdfReader(sourceFiles(i)) ' loop over the pages in that document Dim n As Integer = reader.NumberOfPages Dim page As Integer = 0 While page < n page = page + 1 copy.AddPage(copy.GetImportedPage(reader,page)) End While Next End Using End Using mergedPdf = ms.ToArray() End Using End Function
我现在收到以下错误:
An item with the same key has already been added.
我做了一些调试,并将问题跟踪到以下几行:
copy.AddPage(copy.GetImportedPage(reader,copy.AddPage(copy.GetImportedPage(reader,page)))
为什么会发生这种错误?
我有一个控制台,监视指定文件夹中的单个文件夹,然后需要将该文件夹中的所有pdf合并为一个pdf.我传递一个文件路径数组作为字符串和我想要的输出文件.
原文链接:https://www.f2er.com/vb/255868.html这是我使用的功能.
Public Shared Function MergePdfFiles(ByVal pdfFiles() As String,ByVal outputPath As String) As Boolean Dim result As Boolean = False Dim pdfCount As Integer = 0 'total input pdf file count Dim f As Integer = 0 'pointer to current input pdf file Dim fileName As String Dim reader As iTextSharp.text.pdf.PdfReader = Nothing Dim pageCount As Integer = 0 Dim pdfDoc As iTextSharp.text.Document = Nothing 'the output pdf document 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 'Open the 1st item in the array PDFFiles fileName = pdfFiles(f) reader = New iTextSharp.text.pdf.PdfReader(fileName) 'Get page count pageCount = reader.NumberOfPages pdfDoc = New iTextSharp.text.Document(reader.GetPageSizeWithRotation(1),18,18) writer = PdfWriter.GetInstance(pdfDoc,New FileStream(outputPath,FileMode.OpenOrCreate)) With pdfDoc .Open() End With 'Instantiate a PdfContentByte object cb = writer.DirectContent 'Now loop thru the input pdfs While f < pdfCount 'Declare a page counter variable Dim i As Integer = 0 'Loop thru the current input pdf's pages starting at page 1 While i < pageCount i += 1 'Get the input page size pdfDoc.SetPageSize(reader.GetPageSizeWithRotation(i)) 'Create a new page on the output document pdfDoc.NewPage() 'If it is the 1st page,we add bookmarks to the page 'Now we get the imported page page = writer.GetImportedPage(reader,i) 'Read the imported page's rotation rotation = reader.GetPageRotation(i) 'Then add the imported page to the PdfContentByte object as a template based on the page's rotation If rotation = 90 Then cb.AddTemplate(page,-1.0F,1.0F,reader.GetPageSizeWithRotation(i).Height) ElseIf rotation = 270 Then cb.AddTemplate(page,reader.GetPageSizeWithRotation(i).Width + 60,-30) Else cb.AddTemplate(page,0) End If End While 'Increment f and read the next input pdf file f += 1 If f < pdfCount Then fileName = pdfFiles(f) reader = New iTextSharp.text.pdf.PdfReader(fileName) pageCount = reader.NumberOfPages End If End While 'When all done,we close the document so that the pdfwriter object can write it to the output file pdfDoc.Close() result = True End If Catch ex As Exception Return False End Try Return result End Function