iTextSharp: uso de PDFAction.GotoLocalPage en PDF combinado
He escrito un código que combina varios PDF en un solo PDF que luego visualizo desde MemoryStream. Esto funciona muy bien. Lo que necesito hacer es agregar una tabla de contenido al final del archivo con enlaces al inicio de cada uno de los PDF individuales. Planeé hacer esto usando la acción GotoLocalPage, que tiene una opción para los números de página, pero no parece funcionar. Si cambio la acción al siguiente código a uno de los preestablecidos como PDFAction.FIRSTPAGE, funciona bien. ¿No funciona esto porque estoy usando el objeto PDFCopy para el parámetro escritor de GotoLocalPage?
Document mergedDoc = new Document();
MemoryStream ms = new MemoryStream();
PdfCopy copy = new PdfCopy(mergedDoc, ms);
mergedDoc.Open();
MemoryStream tocMS = new MemoryStream();
Document tocDoc = null;
PdfWriter tocWriter = null;
for (int i = 0; i < filesToMerge.Length; i++)
{
string filename = filesToMerge[i];
PdfReader reader = new PdfReader(filename);
copy.AddDocument(reader);
// Initialise TOC document based off first file
if (i == 0)
{
tocDoc = new Document(reader.GetPageSizeWithRotation(1));
tocWriter = PdfWriter.GetInstance(tocDoc, tocMS);
tocDoc.Open();
}
// Create link for TOC, added random number of 3 for now
Chunk link = new Chunk(filename);
PdfAction action = PdfAction.GotoLocalPage(3, new PdfDestination(PdfDestination.FIT), copy);
link.SetAction(action);
tocDoc.Add(new Paragraph(link));
}
// Add TOC to end of merged PDF
tocDoc.Close();
PdfReader tocReader = new PdfReader(tocMS.ToArray());
copy.AddDocument(tocReader);
copy.Close();
displayPDF(ms.ToArray());
Supongo que una alternativa sería vincular a un elemento con nombre (en lugar del número de página), pero no puedo ver cómo agregar un elemento 'invisible' al comienzo de cada archivo antes de agregarlo al documento combinado.