Pues eso señores.
Tengo una clase vb.net que le pasan rutas (en las cuales crearemos, moveremos y borraremos los archivos pdf).
Detalles: tengo dos pdf, Archivo1.pdf y Archivo2.pdf. En la carpeta NewCarpeta los tengo bien guardados. Hasta ahora bien.
Empezamos con el lio. Creo otro pdf al que llamo ArchivoUnido.pdf, el cual tiene dos paginas (la pagina 1 es Archivo1.pdf, y la pagina 2 es Archivo2.pdf (solo el contenido)), asi que en la carpeta NewCarpeta tengo 3 pdf (Archivo1 y 2 y ArchivoUnido).
Una vez he realizado esta operacion de unir los pdf, lo que hago es copiar ArchivoUnido en otra ruta (Ahora tengo 4 pdf, ArchivoUnido en una ruta y ArchivoUnido,Archivo1,Archivo2 en otra ruta).
En ese momento quiero borrar la carpeta donde estan Archivo1 y Archivo2, ya que no me hacen falta.
Peo al intentar borrar esa carpeta me salta un error diciendo que Archivo1 y 2 estan siendo utilizados por otro.
No se quien estara usandolos si ya ha terminado el metodo de union de pdf.
¿Podria alguien decirme como puedo borrar esa carpeta?
¿o como hacer que nadie este usando los pdf?
¿o cualquier otra sugerencia?
¿uso otra forma para unir pdf menos liosa?
¿que debo hacer?
De antemano, gracias
Con qué code estás intentando hacerlo? y vemos de repararlo o darte otro mas eficiente, ya que sin nada deberíamos hacer todo de 0 y algunos no disponemos tiempo.
Saludos.
Cita de: cbr20 en 31 Mayo 2013, 19:10 PM
Archivo1 y 2 estan siendo utilizados por otro.
No se quien estara usandolos si ya ha terminado el metodo de union de pdf.
Te has dejado algún objeto sin liberar y es quien "está usando" los archivos, pues los mantiene abiertos en modo de lectura o escritura, ya séa un streamreader, streamwritter, stringbuilder, o lo que hayas usado en tu code para realizar "X" operación.
Como ya te han dicho... si no muestras el código poco se puede hacer, pero vamos, el problema es ese, un objeto sin cerrar/liberar, pongo la mano en el fuego al 100%, la excepción que comentas lo provoca eso, así que con que le heches un repaso a tu código para añadir los "end using" o en su defecto ".close"/".dispose" debería ser más que suficiente.
Salu2!
Cita de: EleKtro H@cker en 1 Junio 2013, 09:54 AM
Te has dejado algún objeto sin liberar y es quien "está usando" los archivos, pues los mantiene abiertos en modo de lectura o escritura, ya séa un streamreader, streamwritter, stringbuilder, o lo que hayas usado en tu code para realizar "X" operación.
Como ya te han dicho... si no muestras el código poco se puede hacer, pero vamos, el problema es ese, un objeto sin cerrar/liberar, pongo la mano en el fuego al 100%, la excepción que comentas lo provoca eso, así que con que le heches un repaso a tu código para añadir los "end using" o en su defecto ".close"/".dispose" debería ser más que suficiente.
Salu2!
Estoy de acuerdo che, sin lugar a dudas, ese error me ha pasado mil veces por esto que decis.
Saludos.
Hola
1.
Dim oDirectContent As iTextSharp.text.pdf.PdfContentByte = oPdfWriter.DirectContent
Dim oPdfReader As iTextSharp.text.pdf.PdfReader = New iTextSharp.text.pdf.PdfReader(sInFilePath)
Cierra esos objetos cuando acabes de utilizarlos, tienen métodos para ello.
2.
Try
oPdfDoc.Close()
oPdfWriter.Close()
Catch ex As Exception
Si esos otros dos objetos fallasen al cerrarse seguirán abiertos la próxima vez que llames al sub, intenta mejorar esa parte del código, elimina el Try.
Saludos!
Hey, muchas gracias. Lamento contestar a estas alturas, pero es que como casi todo lo que subo al foro es en el foro de visualBasic (despues de todo uso visualBasic.net) mo me di cuenta de que me movieron el post a este foro, y no he podido revisarlo hasta ahora, jaja.
Ya lo solucione hace unos días, y era precisamente lo que decíais, tenia un reader abierto (más bien dos reader, ya que estaban en un for). En fin, de todad maneras yo adjunto el codigo, que seguro que a alguien le va a venir bien.
Lo dicho, disteis en el clavo, gracias.
El codigo: unir dos pdf.
Imports System.IO
Imports System.IO.FileStream
Imports iTextSharp
Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports iTextSharp.text.Image
Public Class UnirBorrarPdf
Public nombredelArchivo As String
'Esto no deberia estar aqui, lo puse para hacerlo global, pero el original es local
Dim oPdfReader1 As iTextSharp.text.pdf.PdfReader
Dim oPdfReader2 As iTextSharp.text.pdf.PdfReader
Function GetPageCount(ByVal sFolderPath As String) As Integer
Dim iRet As Integer = 0
Dim oFiles As String() = Directory.GetFiles(sFolderPath)
For i As Integer = 0 To oFiles.Length - 1
Dim sFromFilePath As String = oFiles(i)
Dim oFileInfo As New FileInfo(sFromFilePath)
Dim sExt As String = UCase(oFileInfo.Extension).Substring(1, 3)
If sExt = "PDF" Then
iRet += 1
End If
Next
Return iRet
End Function
Sub ProccessFolder(ByVal sFolderPath As String)
Dim bOutputfileAlreadyExists As Boolean = False
Dim oFolderInfo As New System.IO.DirectoryInfo(sFolderPath)
Dim sOutFilePath As String = sFolderPath + nombredelArchivo + ".pdf"
'Dim sOutFilePath As String = sFolderPath + "\" + oFolderInfo.Name + ".pdf"
If System.IO.File.Exists(sOutFilePath) Then
Try
MessageBox.Show("Ya existe el archivo")
Catch ex As Exception
MessageBox.Show("Se supone que fue eliminado el archivo, pero yo no lo hice, jaja")
End Try
End If
Dim iPageCount As Integer = GetPageCount(sFolderPath)
If iPageCount > 0 And bOutputfileAlreadyExists = False Then
Dim oFiles As String() = Directory.GetFiles(sFolderPath)
Dim oPdfDoc As New iTextSharp.text.Document()
Dim oPdfWriter As PdfWriter = PdfWriter.GetInstance(oPdfDoc, New FileStream(sOutFilePath, FileMode.Create))
oPdfDoc.Open()
'LA MODIFICACION DEL FOR
'Elemento1
Dim sFromFilePath1 As String = oFiles(0)
Dim oFileInfo1 As New FileInfo(sFromFilePath1)
Dim sExt1 As String = UCase(oFileInfo1.Extension).Substring(1, 3)
'Elemento2
Dim sFromFilePath2 As String = oFiles(1)
Dim oFileInfo2 As New FileInfo(sFromFilePath2)
Dim sExt2 As String = UCase(oFileInfo2.Extension).Substring(1, 3)
Try
If sExt1 = "PDF" Then 'Elemento1
AddPdf1(sFromFilePath1, oPdfDoc, oPdfWriter)
End If
If sExt2 = "PDF" Then 'Elemento2
AddPdf2(sFromFilePath2, oPdfDoc, oPdfWriter)
End If
Catch ex As Exception
MessageBox.Show("Ummm, algo fallo")
End Try
'FIN FOR MODIFICADO
Try
Try 'mio
oPdfDoc.Close()
Catch ex As Exception 'mio
MessageBox.Show("No se cierra el documento") 'mio
End Try 'mio
Try 'mio
oPdfWriter.Close()
Catch ex As Exception 'mio
MessageBox.Show("No se cierra la escritura") 'mio
End Try 'mio
Catch ex As Exception
Try
System.IO.File.Delete(sOutFilePath)
Catch ex2 As Exception
MessageBox.Show("No va tio, supuestamente esto borraba el solito, pero NO LO HACEEEEEEE")
End Try
End Try
oPdfDoc.Close() 'mio
If (oPdfDoc.IsOpen()) Then 'mio
MessageBox.Show("Esto no se cierra ni a la de tres") 'mio
End If 'mio
oPdfWriter.Close() 'mio
End If 'mio
Dim oFolders As String() = Directory.GetDirectories(sFolderPath)
For i As Integer = 0 To oFolders.Length - 1
Dim sChildFolder As String = oFolders(i)
Dim iPos As Integer = sChildFolder.LastIndexOf("\")
Dim sFolderName As String = sChildFolder.Substring(iPos + 1)
ProccessFolder(sChildFolder)
Next
End Sub
Sub AddPdf1(ByVal sInFilePath As String, ByRef oPdfDoc As iTextSharp.text.Document, ByVal oPdfWriter As PdfWriter)
Dim oDirectContent As iTextSharp.text.pdf.PdfContentByte = oPdfWriter.DirectContent
'Dim oPdfReader As iTextSharp.text.pdf.PdfReader = New iTextSharp.text.pdf.PdfReader(sInFilePath)
'Se avisa al programador de que esta linea fue comentada para convertir la variable en global y asi poder pararla mas tarde
'supusta correccion
oPdfReader1 = New iTextSharp.text.pdf.PdfReader(sInFilePath)
Dim iNumberOfPages As Integer = oPdfReader1.NumberOfPages
Dim iPage As Integer = 0
Do While (iPage < iNumberOfPages)
iPage += 1
oPdfDoc.SetPageSize(oPdfReader1.GetPageSizeWithRotation(iPage))
oPdfDoc.NewPage()
Dim oPdfImportedPage As iTextSharp.text.pdf.PdfImportedPage = _
oPdfWriter.GetImportedPage(oPdfReader1, iPage)
Dim iRotation As Integer = oPdfReader1.GetPageRotation(iPage)
If (iRotation = 90) Or (iRotation = 270) Then
oDirectContent.AddTemplate(oPdfImportedPage, 0, -1.0F, 1.0F, 0, 0, oPdfReader1.GetPageSizeWithRotation(iPage).Height)
Else
oDirectContent.AddTemplate(oPdfImportedPage, 1.0F, 0, 0, 1.0F, 0, 0)
End If
Loop
'mio
'oPdfReader.Close()
End Sub
Sub AddPdf2(ByVal sInFilePath As String, ByRef oPdfDoc As iTextSharp.text.Document, ByVal oPdfWriter As PdfWriter)
Dim oDirectContent As iTextSharp.text.pdf.PdfContentByte = oPdfWriter.DirectContent
'Dim oPdfReader As iTextSharp.text.pdf.PdfReader = New iTextSharp.text.pdf.PdfReader(sInFilePath)
'Se avisa al programador de que esta linea fue comentada para convertir la variable en global y asi poder pararla mas tarde
'supusta correccion
oPdfReader2 = New iTextSharp.text.pdf.PdfReader(sInFilePath)
Dim iNumberOfPages As Integer = oPdfReader2.NumberOfPages
Dim iPage As Integer = 0
Do While (iPage < iNumberOfPages)
iPage += 1
oPdfDoc.SetPageSize(oPdfReader2.GetPageSizeWithRotation(iPage))
oPdfDoc.NewPage()
Dim oPdfImportedPage As iTextSharp.text.pdf.PdfImportedPage = _
oPdfWriter.GetImportedPage(oPdfReader2, iPage)
Dim iRotation As Integer = oPdfReader2.GetPageRotation(iPage)
If (iRotation = 90) Or (iRotation = 270) Then
oDirectContent.AddTemplate(oPdfImportedPage, 0, -1.0F, 1.0F, 0, 0, oPdfReader2.GetPageSizeWithRotation(iPage).Height)
Else
oDirectContent.AddTemplate(oPdfImportedPage, 1.0F, 0, 0, 1.0F, 0, 0)
End If
Loop
'mio
'oPdfReader.Close()
End Sub
Public Sub btnProcess(ByVal sFromPath)
If Not Directory.Exists(sFromPath) Then
MsgBox("Folder does not exist")
Exit Sub
End If
ProccessFolder(sFromPath)
MessageBox.Show("Proceso terminado, asegurese de que la plicacion ha dado el resultado esperado (y compruebe que no se han borrado ni modificado documentos de por ahi)")
oPdfReader1.Close()
oPdfReader2.Close()
End Sub
Public Sub moverPdf(ByVal ruta1, ByVal ruta2, ByVal ruta3)
FileCopy(ruta1, ruta2)
System.IO.Directory.Delete(ruta3, True)
MessageBox.Show("Proceso terminado completamente")
End Sub
End Class
Disfrutadlo, nos vemos en el foro, adioooooooooooooooooooooooos