Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net Net将多个PDF合并为一个PDF并导出_Vb.net_Pdf_Itextsharp - Fatal编程技术网

Vb.net Net将多个PDF合并为一个PDF并导出

Vb.net Net将多个PDF合并为一个PDF并导出,vb.net,pdf,itextsharp,Vb.net,Pdf,Itextsharp,我必须将多个PDF合并成一个PDF 我正在使用iText.sharp库,收集转换后的代码并尝试使用它(从) 实际代码是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 A

我必须将多个PDF合并成一个PDF

我正在使用iText.sharp库,收集转换后的代码并尝试使用它(从) 实际代码是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

为什么会发生此错误?

我有一个控制台,可以监视指定文件夹中的各个文件夹,然后需要将该文件夹中的所有pdf合并到单个pdf中。我将文件路径数组作为字符串和我想要的输出文件传递

这是我使用的函数

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, 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, 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
                '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
公共共享函数mergePffiles(ByVal Pffiles()作为字符串,ByVal outputPath作为字符串)作为布尔值
将结果设置为布尔值=False
Dim pdfCount As Integer=0'输入pdf文件总数
Dim f As Integer=0'指向当前输入pdf文件的指针
将文件名设置为字符串
将读卡器调暗为iTextSharp.text.pdf.PdfReader=无
Dim pageCount为整数=0
将pdfDoc设置为iTextSharp.text.Document=Nothing'输出pdf文档
作为PdfWriter的Dim writer=无
作为PdfContentByte的尺寸cb=无
将页面变暗为PdfImportedPage=无
将旋转调整为整数=0
尝试
pdfCount=Pdfiles.Length
如果pdfCount>1,则
'打开数组Pdfiles中的第一项
fileName=pdfFiles(f)
reader=New iTextSharp.text.pdf.PdfReader(文件名)
'获取页面计数
pageCount=reader.NumberOfPages
pdfDoc=New iTextSharp.text.Document(reader.GetPageSizeWithRotation(1,18,18,18)
writer=PdfWriter.GetInstance(pdfDoc,新文件流(outputPath,FileMode.OpenOrCreate))
使用pdfDoc
.Open()
以
'实例化PdfContentByte对象
cb=writer.DirectContent
'现在循环输入PDF
而f
有些人可能必须更改“
writer=PdfWriter.GetInstance(pdfDoc,newfilestream(outputPath,FileMode.OpenOrCreate))
”处的代码,因为
iTextSharp
可能不支持

改为:

Dim fs As IO.FileStream = New IO.FileStream(outputPath, IO.FileMode.Create)

writer = iTextSharp.text.pdf.PdfWriter.GetInstance(pdfDoc, fs)

我意识到我参加聚会已经很晚了,但在阅读了来自@BrunoLowagie的评论后,我想看看我是否可以利用他链接的示例章节中的示例来整理一些东西。这可能有点过头了,但我把一些代码放在一起,将多个PDF合并到一个文件中,并发布在code Review SE网站上(该帖子包含完整的类代码)。它现在只合并PDF文件,但我计划在以后添加附加功能的方法

“master”方法(在链接文章的
块的末尾,也在下面发布以供参考)处理PDF文件的实际合并,但多个重载提供了许多选项来定义原始文件列表。到目前为止,我已包括以下功能:

  • 如果合并成功,这些方法将返回一个
    System.IO.FileInfo
    对象
  • 提供一个标识路径的
    System.IO.DirectoryInfo
    对象或
    System.String
    ,它将收集该目录中的所有PDF文件(包括指定的子目录)以合并
  • 提供
    列表(System.String)
    列表(System.IO.FileInfo)
    指定要合并的PDF
  • 确定合并前PDF应如何排序(如果使用
    MergeAll
    方法之一获取目录中的所有PDF文件,则特别有用)
  • 如果指定的输出PDF文件已存在,则可以指定是否覆盖该文件。(我正在考虑添加自动调整输出PDF文件名称的“功能”(如果已经存在)
  • 警告
    错误
    属性提供了一种在调用方法中获取反馈的方法,无论合并是否成功
一旦代码就位,就可以这样使用:
Dim fs As IO.FileStream = New IO.FileStream(outputPath, IO.FileMode.Create)

writer = iTextSharp.text.pdf.PdfWriter.GetInstance(pdfDoc, fs)
Dim PDFDir As New IO.DirectoryInfo("C:\Test Data\PDF\")
Dim ResultFile As IO.FileInfo = Nothing
Dim Merger As New PDFManipulator

ResultFile = Merger.MergeAll(PDFDir, "C:\Test Data\PDF\Merged.pdf", True, PDFManipulator.PDFMergeSortOrder.FileName, True)
Public Function Merge(ByVal PDFFiles As List(Of System.IO.FileInfo), ByVal OutputFileName As String, ByVal OverwriteExistingPDF As Boolean, ByVal SortOrder As PDFMergeSortOrder) As System.IO.FileInfo
    Dim ResultFile As System.IO.FileInfo = Nothing
    Dim ContinueMerge As Boolean = True

    If OverwriteExistingPDF Then
        If System.IO.File.Exists(OutputFileName) Then
            Try
                System.IO.File.Delete(OutputFileName)
            Catch ex As Exception
                ContinueMerge = False

                'If Errors Is Nothing Then
                '    Errors = New List(Of String)
                'End If

                'Errors.Add("Could not delete existing output file.")

                Throw
            End Try
        End If
    End If

    If ContinueMerge Then
        Dim OutputPDF As iTextSharp.text.Document = Nothing
        Dim Copier As iTextSharp.text.pdf.PdfCopy = Nothing
        Dim PDFStream As System.IO.FileStream = Nothing
        Dim SortedList As New List(Of System.IO.FileInfo)

        Try
            Select Case SortOrder
                Case PDFMergeSortOrder.Original
                    SortedList = PDFFiles
                Case PDFMergeSortOrder.FileDate
                    SortedList = PDFFiles.OrderBy(Function(f As System.IO.FileInfo) f.LastWriteTime).ToList
                Case PDFMergeSortOrder.FileName
                    SortedList = PDFFiles.OrderBy(Function(f As System.IO.FileInfo) f.Name).ToList
                Case PDFMergeSortOrder.FileNameWithDirectory
                    SortedList = PDFFiles.OrderBy(Function(f As System.IO.FileInfo) f.FullName).ToList
            End Select

            If Not IO.Directory.Exists(New IO.FileInfo(OutputFileName).DirectoryName) Then
                Try
                    IO.Directory.CreateDirectory(New IO.FileInfo(OutputFileName).DirectoryName)
                Catch ex As Exception
                    ContinueMerge = False

                    'If Errors Is Nothing Then
                    '    Errors = New List(Of String)
                    'End If

                    'Errors.Add("Could not create output directory.")

                    Throw
                End Try
            End If

            If ContinueMerge Then
                OutputPDF = New iTextSharp.text.Document
                PDFStream = New System.IO.FileStream(OutputFileName, System.IO.FileMode.OpenOrCreate)
                Copier = New iTextSharp.text.pdf.PdfCopy(OutputPDF, PDFStream)

                OutputPDF.Open()

                For Each PDF As System.IO.FileInfo In SortedList
                    If ContinueMerge Then
                        Dim InputReader As iTextSharp.text.pdf.PdfReader = Nothing

                        Try
                            InputReader = New iTextSharp.text.pdf.PdfReader(PDF.FullName)

                            For page As Integer = 1 To InputReader.NumberOfPages
                                Copier.AddPage(Copier.GetImportedPage(InputReader, page))
                            Next page

                            If InputReader.IsRebuilt Then
                                'If Warnings Is Nothing Then
                                '    Warnings = New List(Of String)
                                'End If

                                'Warnings.Add("Damaged PDF: " & PDF.FullName & " repaired and successfully merged into output file.")
                            End If
                        Catch InvalidEx As iTextSharp.text.exceptions.InvalidPdfException
                            'Skip this file
                            'If Errors Is Nothing Then
                            '    Errors = New List(Of String)
                            'End If

                            'Errors.Add("Invalid PDF: " & PDF.FullName & " not merged into output file.")
                        Catch FormatEx As iTextSharp.text.pdf.BadPdfFormatException
                            'Skip this file
                            'If Errors Is Nothing Then
                            '    Errors = New List(Of String)
                            'End If

                            'Errors.Add("Bad PDF Format: " & PDF.FullName & " not merged into output file.")
                        Catch PassworddEx As iTextSharp.text.exceptions.BadPasswordException
                            'Skip this file
                            'If Errors Is Nothing Then
                            '    Errors = New List(Of String)
                            'End If

                            'Errors.Add("Password-protected PDF: " & PDF.FullName & " not merged into output file.")
                        Catch OtherEx As Exception
                            ContinueMerge = False
                        Finally
                            If Not InputReader Is Nothing Then
                                InputReader.Close()
                                InputReader.Dispose()
                            End If
                        End Try
                    End If
                Next PDF
            End If
        Catch ex As iTextSharp.text.pdf.PdfException
            ResultFile = Nothing
            ContinueMerge = False

            'If Errors Is Nothing Then
            '    Errors = New List(Of String)
            'End If

            'Errors.Add("iTextSharp Error: " & ex.Message)

            If System.IO.File.Exists(OutputFileName) Then
                If Not OutputPDF Is Nothing Then
                    OutputPDF.Close()
                    OutputPDF.Dispose()
                End If

                If Not PDFStream Is Nothing Then
                    PDFStream.Close()
                    PDFStream.Dispose()
                End If

                If Not Copier Is Nothing Then
                    Copier.Close()
                    Copier.Dispose()
                End If

                System.IO.File.Delete(OutputFileName)
            End If

            Throw
        Catch other As Exception
            ResultFile = Nothing
            ContinueMerge = False

            'If Errors Is Nothing Then
            '    Errors = New List(Of String)
            'End If

            'Errors.Add("General Error: " & other.Message)

            If System.IO.File.Exists(OutputFileName) Then
                If Not OutputPDF Is Nothing Then
                    OutputPDF.Close()
                    OutputPDF.Dispose()
                End If

                If Not PDFStream Is Nothing Then
                    PDFStream.Close()
                    PDFStream.Dispose()
                End If

                If Not Copier Is Nothing Then
                    Copier.Close()
                    Copier.Dispose()
                End If

                System.IO.File.Delete(OutputFileName)
            End If

            Throw
        Finally
            If Not OutputPDF Is Nothing Then
                OutputPDF.Close()
                OutputPDF.Dispose()
            End If

            If Not PDFStream Is Nothing Then
                PDFStream.Close()
                PDFStream.Dispose()
            End If

            If Not Copier Is Nothing Then
                Copier.Close()
                Copier.Dispose()
            End If

            If System.IO.File.Exists(OutputFileName) Then
                If ContinueMerge Then
                    ResultFile = New System.IO.FileInfo(OutputFileName)

                    If ResultFile.Length <= 0 Then
                        ResultFile = Nothing

                        Try
                            System.IO.File.Delete(OutputFileName)
                        Catch ex As Exception
                            Throw
                        End Try
                    End If
                Else
                    ResultFile = Nothing

                    Try
                        System.IO.File.Delete(OutputFileName)
                    Catch ex As Exception
                        Throw
                    End Try
                End If
            Else
                ResultFile = Nothing
            End If
        End Try
    End If

    Return ResultFile
End Function
Public Sub MergePDFFiles(ByVal outPutPDF As String) 

    Dim StartPath As String = FileArray(0) ' this is a List Array declared Globally
    Dim document = New Document()
    Dim outFile = Path.Combine(outPutPDF)' The outPutPDF varable is passed from another sub this is the output path
    Dim writer = New PdfCopy(document, New FileStream(outFile, FileMode.Create))

    Try

        document.Open()
        For Each fileName As String In FileArray

            Dim reader = New PdfReader(Path.Combine(StartPath, fileName))

            For i As Integer = 1 To reader.NumberOfPages

                Dim page = writer.GetImportedPage(reader, i)
                writer.AddPage(page)

            Next i

            reader.Close()

        Next

        writer.Close()
        document.Close()

    Catch ex As Exception
        'catch a Exception if needed

    Finally

        writer.Close()
        document.Close()

    End Try


End Sub