为什么我复制的 PDF 文件大小不正确?

Why is my copied PDF file sized incorrect?

我需要删除 PDF 文件的前几页。显然,最简单的方法是创建它的副本而不是复制不需要的页面。这可行,但它们看起来比应有的小很多。有什么想法吗?

它应该是什么样子

实际情况

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

您描述的问题在常见问题解答中有解释。例如在问题的回答中:

使用PdfWriter 来操作PDF 文档是一个非常糟糕的主意。阅读 chapter 6 of my book 以发现为什么这是一个坏主意,并查看 Table 6.1 以找出哪个 class 更合适。

在同一章中,您会找到 SelectPages 示例。假设您要创建一个仅包含第 4 到 8 页的新 PDF。在这种情况下,您只需使用 SelectPages() 方法和 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();

通过使用 PdfReader,页面大小以及可能存在的任何交互功能都得以保留。

您的方法很糟糕,因为您不尊重原始页面大小:您将字母 (?) 格式的文档复制到 A4 页面的文档。如果页面的原点与左下角不对应,则文档的某些部分将不可见。如果您的 PDF 中有交互功能,它们将会丢失。在您可以遵循的所有可能示例中,您选择了最差的一个...