- Code: Select all
public static void CopyToUnlocked(Stream lockedStream, Stream outputStream)
{
var lockedPDF = new PdfDocument();
var unlockedPDF = new PdfDocument();
int lockedPDFPageCount;
var errorUnlockingPDF = false;
try { lockedPDF.LoadFromStream(lockedStream); }
catch (Exception) { errorUnlockingPDF = true; }
try { lockedPDFPageCount = lockedPDF.Pages.Count; }
catch (Exception) { errorUnlockingPDF = true; }
if (!errorUnlockingPDF)
{
foreach (PdfPageBase page in lockedPDF.Pages)
{
PdfPageBase newPage;
if (page.Rotation == PdfPageRotateAngle.RotateAngle90 || page.Rotation == PdfPageRotateAngle.RotateAngle270)
newPage = unlockedPDF.Pages.Add(new SizeF(page.Size.Height, page.Size.Width), new PdfMargins(0));
else
newPage = unlockedPDF.Pages.Add(new SizeF(page.Size.Width, page.Size.Height), new PdfMargins(0));
page.CreateTemplate().Draw(newPage, new PointF(0, 0));
}
//get bookmarks from original pdf
var bms = lockedPDF.Bookmarks;
for (int i = 0; i < bms.Count; i++)
{
//add parent bookmark
PdfDestination vendorBookmarkDest = new PdfDestination(bms[i].Destination.Page, bms[i].Destination.Location);
PdfBookmark vendorBookmark = unlockedPDF.Bookmarks.Add(bms[i].Title);
vendorBookmark.Color = bms[i].Color;
vendorBookmark.DisplayStyle = bms[i].DisplayStyle;
vendorBookmark.Action = new PdfGoToAction(vendorBookmarkDest);
for (int j = 0; j < bms[i].Count; j++)
{
//add child bookmark
PdfDestination partBookmarkDest = new PdfDestination(bms[i][j].Destination.Page, bms[i][j].Destination.Location);
PdfBookmark partBookmark = vendorBookmark.Add(bms[i][j].Title);
partBookmark.Color = bms[i][j].Color;
partBookmark.DisplayStyle = bms[i][j].DisplayStyle;
partBookmark.Action = new PdfGoToAction(partBookmarkDest);
}
}
}
if (errorUnlockingPDF)
lockedStream.CopyTo(outputStream);
else
unlockedPDF.SaveToStream(outputStream);
}