Estoy tratando de combinar muchos PDF y para cada PDF quiero agregar un marcador (el nombre del pdf), encontré diferentes técnicas de fusión de PDF pero ninguno de ellos puede agregar solo el marcador anterior, por ej. itextsharp add es un capítulo, luego el marcador para el capítulo, no quiero alterar el pdf.Fusionando archivos pdf con marcadores
Respuesta
Usando itextsharp puedes hacerlo. lo hago por el siguiente método ...
MergePdfFiles(string outputPdf, string[] sourcePdfs)
{
PdfReader reader = null;
Document document = new Document();
PdfImportedPage page = null;
PdfCopy pdfCpy = null;
int n = 0;
int totalPages = 0;
int page_offset = 0;
List<Dictionary<string, object>> bookmarks = new List<Dictionary<string, object>>();
IList<Dictionary<string, object>> tempBookmarks;
for (int i = 0; i <= sourcePdfs.GetUpperBound(0); i++)
{
reader = new PdfReader(sourcePdfs[i]);
reader.ConsolidateNamedDestinations();
n = reader.NumberOfPages;
tempBookmarks = SimpleBookmark.GetBookmark(reader);
if (i == 0)
{
document = new iTextSharp.text.Document(reader.GetPageSizeWithRotation(1));
pdfCpy = new PdfCopy(document, new FileStream(outputPdf, FileMode.Create));
document.Open();
SimpleBookmark.ShiftPageNumbers(tempBookmarks, page_offset, null);
page_offset += n;
if (tempBookmarks != null)
bookmarks.AddRange(tempBookmarks);
// MessageBox.Show(n.ToString());
totalPages = n;
}
else
{
SimpleBookmark.ShiftPageNumbers(tempBookmarks, page_offset, null);
if (tempBookmarks != null)
bookmarks.AddRange(tempBookmarks);
page_offset += n;
totalPages += n;
}
for (int j = 1; j <= n; j++)
{
page = pdfCpy.GetImportedPage(reader, j);
pdfCpy.AddPage(page);
}
reader.Close();
}
pdfCpy.Outlines = bookmarks;
document.Close();
}
Se ejecutó este código y se combinó el pdf, pero no se agregaron marcadores. Los archivos PDF iniciales deben tener marcadores para mostrar en el pdf final. – Moji
Solo tengo que decir ¡Gracias por este código! He estado navegando por la web durante los últimos días hasta que me encontré con esto en este momento. ¡Gracias de nuevo! – calcazar
bien, después de algún tiempo de búsqueda tropecé con esta pieza de código, ¡funciona perfectamente! – Gelootn
Pruebe Docotic.Pdf library para la tarea.
Aquí es un ejemplo de código que hace lo que usted describe:
public static void combineDocumentsWithBookmarks()
{
string[] names = new string[] { "first.pdf", "second.pdf", "third.pdf" };
using (PdfDocument pdf = new PdfDocument())
{
int targetPageIndex = 0;
for (int i = 0; i < names.Length; i++)
{
string currentName = names[i];
if (i == 0)
pdf.Open(currentName);
else
pdf.Append(currentName);
pdf.OutlineRoot.AddChild(currentName, targetPageIndex);
targetPageIndex = pdf.PageCount;
}
// setting PageMode will cause PDF viewer to display
// bookmarks pane when document is open
pdf.PageMode = PdfPageMode.UseOutlines;
pdf.Save("output.pdf");
}
}
La muestra combina diferentes documentos en un solo PDF y crea marcadores. Cada marcador apunta a la primera página del documento original.
Descargo de responsabilidad: Trabajo para la compañía que desarrolla la biblioteca Docotic.Pdf.
public string MergeFiles(string outputPath)
{
if (string.IsNullOrEmpty(outputPath))
throw new NullReferenceException("Path for output document is null or empty.");
using (Document outputDocument = new Document())
{
using (PdfCopy pdf = new PdfCopy(outputDocument, new FileStream(outputPath, FileMode.Create)))
{
outputDocument.Open();
// All bookmarks for output document
List<Dictionary<string, object>> bookmarks = new List<Dictionary<string, object>>();
// Bookmarks of the current document
IList<Dictionary<string, object>> tempBookmarks;
int pageOffset = 0;
// Merge documents and add bookmarks
foreach (string file in Files)
{
using (PdfReader reader = new PdfReader(file))
{
reader.ConsolidateNamedDestinations();
// Get bookmarks of current document
tempBookmarks = SimpleBookmark.GetBookmark(reader);
SimpleBookmark.ShiftPageNumbers(tempBookmarks, pageOffset, null);
pageOffset += reader.NumberOfPages;
if(tempBookmarks != null)
// Add bookmarks of current document to all bookmarks
bookmarks.AddRange(tempBookmarks);
// Add every page of document to output document
for (int i = 1; i <= reader.NumberOfPages; i++)
pdf.AddPage(pdf.GetImportedPage(reader, i));
}
}
// Add all bookmarks to output document
pdf.Outlines = bookmarks;
}
}
return outputPath;
}
optimicé respuesta Md Kamruzzaman de Sarker mediante el uso de un bucle foreach para repasar los archivos PDF y el uso de declaraciones. De esta manera, me parece más limpio, pero todos los créditos van para él.
- 1. Fusionando archivos PDF con ITextSharp
- 2. Fusionando marcadores en mercurial
- 3. Fusionando 2 pdf con Zend Framework
- 4. Fusionando imágenes png en un archivo pdf
- 5. Fusionando archivos CSS
- 6. fusionando dos archivos
- 7. Fusionando varios archivos javascript
- 8. Fusionando archivos de proyecto Xcode
- 9. Fusionando archivos vcproj - SCM infierno
- 10. Generando archivos PDF con PHP
- 11. Mostrar archivos PDF con python3
- 12. Fusionando dos archivos con cat sin línea nueva
- 13. Fusionando con "git mergetool"
- 14. torty svn siempre fusionando 45 archivos extra
- 15. Lea los archivos pdf con php
- 16. ¿Cómo puedo combinar archivos PDF con Perl?
- 17. archivos PDF de impresión con PDFsharp
- 18. Indexando archivos PDF con Symfony usando Lucene
- 19. PDFBox: trabajando con archivos PDF muy grandes.
- 20. Rellenar varios archivos PDF
- 21. desbloquear archivos PDF protegidos
- 22. Fusionar archivos PDF
- 23. Fusionando ramas múltiples con git
- 24. Mercurial, "ramificación con marcadores"
- 25. Combinar archivos PDF C#
- 26. Git fusionando los pasos
- 27. Mostrar favicon para archivos PDF
- 28. XCode Storyboard fusionando
- 29. Linux: fusionando varios archivos, cada uno en una nueva línea
- 30. TFS Merging continúa fusionando algunos archivos sin ningún cambio
Quizás necesite extraer las páginas individuales y volver a unirlas en un único archivo. De esta manera puede marcar la primera página de cada pdf con el marcador – gyurisc
No sé cómo agregar un simplebookmark – XandrUu