удалить файл PDF после слияния vb.net с помощью iTextSharp

Я объединяю два PDF-файла в один, используя функцию, которую я нашел здесь

Private Sub MergePdfFiles(ByVal pdfFiles() As String, ByVal outputPath As String)
        Dim pdfCount As Integer = 0
        Dim f As Integer = 0
        Dim fileName 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
                fileName = pdfFiles(f)
                reader = New iTextSharp.text.pdf.PdfReader(fileName)
                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
                        fileName = pdfFiles(f)
                        reader = New iTextSharp.text.pdf.PdfReader(fileName)
                        pageCount = reader.NumberOfPages
                    End If
                End While
                pdfDoc.Close()
                reader.Close()
            End If
        Catch ex As Exception
            'err
        End Try
    End Sub

Теперь мне нужно удалить старые файлы «pdfFiles ()», но я получаю сообщение об ошибке «Процесс не может получить доступ к файлу« C: .... PDF », потому что он используется другим процессом». это происходит только с первым файлом, у меня нет проблем с другим

OP Здесь с функцией

Спасибо


person Carlos Anez    schedule 27.05.2016    source источник
comment
Беглый взгляд показывает, что по крайней мере writer не закрывается и не утилизируется, я бы начал с этого.   -  person Chris Haas    schedule 27.05.2016
comment
Мне также не совсем понятно, почему какая-то работа выполняется вне цикла, а какая-то внутри. Это было бы действительно хорошим местом для for each вместо ИМХО.   -  person Chris Haas    schedule 27.05.2016
comment
Я закрываю средство записи и все еще не повезло, я думаю, что найду другой способ сделать это, и я только что нашел эту функцию, копировать, вставить, затем я протестировал и работал нормально, я уверен, что должен быть лучший способ сделать это Это   -  person Carlos Anez    schedule 27.05.2016
comment
@Chris writer не закрывается и не удаляется - writer неявно закрывается, когда закрывается pdfDoc.   -  person mkl    schedule 28.05.2016


Ответы (2)


Я знаю, что это на С#, но это то, что я использую для объединения файлов.

var document = new Document();
var outFile = Path.Combine(finishedFilePath, fileName + ".pdf");
var writer = new PdfCopy(document, new FileStream(outFile, FileMode.Create));
try
{
    document.Open();
    foreach (var fileName in filesList)
    {
         var reader = new PdfReader(Path.Combine(StartPath, fileName));

         for (var i = 1; i <= reader.NumberOfPages; i++)
         {
             var page = writer.GetImportedPage(reader, i);
             writer.AddPage(page);
         }

         reader.Close();
    }

    writer.Close();
    document.Close();
}
catch (Exception ex)
{
    //catch error             
}
finally
{
    writer.Close();
    document.Close();
}

Надеюсь, это поможет в некотором роде.

person Eric    schedule 27.05.2016
comment
Использование PdfCopy на самом деле является предпочтительным методом для объединения PDF-файлов. - person mkl; 28.05.2016
comment
@mkl - мне придется посмотреть на использование PdfCopy. спасибо, что сообщили мне о методе perferrd. :D - person Eric; 31.05.2016

Код, который был помечен как правильный, написан на С#, вот версия vb.net:

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

Конец сабвуфера

person Gerald Leesmann    schedule 19.03.2018