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

时间:2016-09-12 08:34:52

标签: c# itext

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

应该如何看待 How it should look

它看起来如何 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();
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

您描述的问题在FAQ中有解释。例如,在回答问题时:

使用PdfWriter来处理PDF文档是一个非常糟糕的主意。阅读chapter 6 of my book以了解为什么这是一个坏主意,并查看表6.1以找出哪个类更适合。

在同一章中,您将找到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中存在交互式功能,它们将会丢失。在您可能遵循的所有可能示例中,您选择了最差的一个......