Joseph Simmons
Joseph Simmons

Reputation: 143

Why is my copied PDF file sized incorrect?

I need to remove the first few pages of a PDF file. Apparently, the easiest way to do that is to create a copy of it and not duplicate the unwanted pages. This works, but they look a lot smaller than they should. Any ideas?

How it should look How it should look

How it actually looks How it actually looks

        private static void ClipSpecificPDF(string input, string output, int pagesToCut)
    {

        PdfReader myReader = new PdfReader(input);

        using (FileStream fs = new FileStream(output, FileMode.Create, FileAccess.Write, FileShare.None))
        {
            using (Document doc = new Document())
            {
                using (PdfWriter myWriter = PdfWriter.GetInstance(doc, fs))
                {

                    //Open the desitination for writing
                    doc.Open();
                    //Loop through each page that we want to keep
                    for (int i = pagesToCut; i < myReader.NumberOfPages; i++)
                    {

                        //Add a new blank page to destination document
                        var PS = myReader.GetPageSizeWithRotation(i);
                        myWriter.SetPageSize(PS);
                        doc.NewPage();

                        //Extract the given page from our reader and add it directly to the destination PDF
                        myWriter.DirectContent.AddTemplate(myWriter.GetImportedPage(myReader, i + 1), 0, 0);

                    }
                    //Close our document
                    doc.Close();
                }
            }
        }
    }

Upvotes: 0

Views: 78

Answers (1)

Bruno Lowagie
Bruno Lowagie

Reputation: 77528

The problem you describe is explained in the FAQ. For instance in the answer to the questions:

Using PdfWriter to manipulate PDF documents is a very bad idea. Read chapter 6 of my book to discover why this is a bad idea, and take a look at Table 6.1 to find out which class is a better fit.

In the same chapter, you'll find the SelectPages example. Suppose that you want to create a new PDF containing only page 4 to 8. In that case, you simply use the SelectPages() method and PdfStamper:

PdfReader reader = new PdfReader(src);
reader.SelectPages("4-8");
PdfStamper stamper = new PdfStamper(reader, new FileStream(dest, FileMode.Create, FileAccess.Write));
stamper.Close();
reader.Close();

By using PdfReader, the page size is preserved, as well as any of the interactive features that may be present.

Your approach is bad because you do not respect the original page size: you copy a document with letter (?) format to a document with A4 pages. If the origin of the page doesn't correspond with the lower-left corner, parts of your document will be invisible. If there are interactive features in your PDF, they will be lost. Of all the possible examples you could have followed, you picked the worst one...

Upvotes: 1

Related Questions