pdfwriter - VB.Net Combina mĂșltiples archivos PDF en uno y exporta
itextsharp text (2)
Algunos pueden tener que hacer un cambio en el código en " writer = PdfWriter.GetInstance(pdfDoc, New FileStream(outputPath, FileMode.OpenOrCreate))
" ya que iTextSharp
puede no ser compatible.
Cambiar a:
Dim fs As IO.FileStream = New IO.FileStream(outputPath, IO.FileMode.Create)
writer = iTextSharp.text.pdf.PdfWriter.GetInstance(pdfDoc, fs)
Tengo que combinar varios PDF en un solo PDF.
Estoy usando la biblioteca iText.sharp, y recolecté el código convertido e intenté usarlo (desde aquí ) El código real está en C # y lo convertí a 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
Ahora recibo el siguiente error:
Un artículo con la misma clave ya ha sido agregado.
Hice algunas depuraciones y seguí el problema hasta las siguientes líneas:
copy.AddPage(copy.GetImportedPage(reader,
copy.AddPage(copy.GetImportedPage(reader, page)))
¿Por qué está ocurriendo este error?
Tengo una consola que supervisa las carpetas individuales en una carpeta designada y luego necesita combinar todos los archivos PDF de esa carpeta en un único archivo PDF. Paso una serie de rutas de archivos como cadenas y el archivo de salida me gustaría.
Esta es la función que uso.
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