can you help me to translate the function below from iTextSharp 5.5 to iText 8.0.1?
This function is used to open a PDF, create a mirror, add a black frame and save the document to a new output file
public static void FlipPDF(string input, string output, bool mirror, bool addFrame)
{
using (PdfReader reader = new PdfReader(input))
{
using (Document doc = new Document(reader.GetPageSizeWithRotation(1)))
{
using (FileStream fs = new FileStream(output, FileMode.Create))
{
using (PdfWriter writer = PdfWriter.GetInstance(doc, fs))
{
doc.Open();
PdfContentByte pcb = writer.DirectContent;
for (int i = 1; i <= reader.NumberOfPages; ++i)
{
Rectangle pagesize = reader.GetPageSizeWithRotation(i);
doc.SetPageSize(pagesize);
doc.NewPage();
PdfImportedPage page = writer.GetImportedPage(reader, i);
if (mirror)
{
AffineTransform t = AffineTransform.GetScaleInstance(-1, 1);
t.Translate(-pagesize.Width, 0);
pcb.AddTemplate(page, t);
}
else
{
AffineTransform t = AffineTransform.GetScaleInstance(1, 1);
pcb.AddTemplate(page, t);
}
if (addFrame)
{
pcb.SaveState();
pcb.SetLineWidth(10);
pcb.SetColorStroke(BaseColor.BLACK);
pcb.Rectangle(208, 30, 180, page.Height - 51);
pcb.Stroke();
pcb.RestoreState();
}
}
doc.Close();
}
}
}
}
}
I tried in this way, I am able to generate the document but I get only the frame, flip/mirror is not working because the layout is the same of the source document:
public static void FlipPDF(string input, string output, bool mirror, bool addFrame)
{
try
{
using (PdfReader reader = new PdfReader(input))
{
using (PdfDocument source = new PdfDocument(reader))
{
using (StreamWriter sw = new StreamWriter(output, false))
{
using (PdfWriter dest = new PdfWriter(sw.BaseStream).SetSmartMode(true))
{
dest.SetCloseStream(false);
using (PdfDocument pdf = new PdfDocument(dest))
{
for (int i = 1; i <= source.GetNumberOfPages(); ++i)
{
var pswr = source.GetPage(i).GetPageSizeWithRotation();
pdf.SetDefaultPageSize(new iText.Kernel.Geom.PageSize(pswr));
source.CopyPagesTo(i, i, pdf);
var page = pdf.GetLastPage();
PdfCanvas pc = new PdfCanvas(page);
if (mirror)
{
iText.Kernel.Geom.AffineTransform t = iText.Kernel.Geom.AffineTransform.GetScaleInstance(-1, 1);
t.Translate(-pswr.GetWidth(),0);
pc.SaveState();
pc.ConcatMatrix(t);
pc.RestoreState();
}
if (addFrame)
{
pc.SaveState();
pc.SetLineWidth(10);
pc.SetFillColor(iText.Kernel.Colors.ColorConstants.BLACK);
pc.Rectangle(208, 30, 180, pswr.GetHeight() - 51);
pc.Stroke();
pc.RestoreState();
}
}
pdf.Close();
}
}
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Finally I found a solution:
public static void FlipPDF(string input, string output, bool mirror, bool addFrame){
try
{
using (PdfReader reader = new PdfReader(input))
{
using (PdfDocument source = new PdfDocument(reader))
{
using (StreamWriter sw = new StreamWriter(output, false))
{
using (PdfWriter dest = new PdfWriter(sw.BaseStream).SetSmartMode(true))
{
dest.SetCloseStream(false);
using (PdfDocument pdf = new PdfDocument(dest))
{
for (int i = 1; i <= source.GetNumberOfPages(); ++i)
{
var origPage = source.GetPage(i);
var pswr = origPage.GetPageSizeWithRotation();
pdf.SetDefaultPageSize(new iText.Kernel.Geom.PageSize(pswr));
PdfPage page;
if (mirror)
{
page = pdf.AddNewPage(iText.Kernel.Geom.PageSize.A4);
}
else
{
source.CopyPagesTo(i, i, pdf);
page = pdf.GetLastPage();
}
PdfCanvas pc = new PdfCanvas(page);
if (mirror)
{
iText.Kernel.Geom.AffineTransform t = iText.Kernel.Geom.AffineTransform.GetScaleInstance(-1, 1);
t.Translate(-pswr.GetWidth(), 0);
pc.ConcatMatrix(t);
PdfFormXObject pageCopy = origPage.CopyAsFormXObject(pdf);
pc.AddXObject(pageCopy);
}
if (addFrame)
{
pc.SaveState();
pc.SetLineWidth(10);
pc.SetFillColor(iText.Kernel.Colors.ColorConstants.BLACK);
pc.Rectangle(208, 30, 180, pswr.GetHeight() - 51);
pc.Stroke();
pc.RestoreState();
}
}
pdf.Close();
}
}
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}}