Search code examples
c#itext

C# Migration to iText 8 - flip/mirror PDF


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);
    }
}

Solution

  • 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);
    }}