我需要删除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();
}
}
}
}
答案 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中存在交互式功能,它们将会丢失。在您可能遵循的所有可能示例中,您选择了最差的一个......