为什么我复制的 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();
}
}
}
}
您描述的问题在常见问题解答中有解释。例如在问题的回答中:
- How to merge documents correctly?
- Why does the function to concatenate / merge PDFs cause issues in some cases?
使用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 中有交互功能,它们将会丢失。在您可以遵循的所有可能示例中,您选择了最差的一个...
我需要删除 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();
}
}
}
}
您描述的问题在常见问题解答中有解释。例如在问题的回答中:
- How to merge documents correctly?
- Why does the function to concatenate / merge PDFs cause issues in some cases?
使用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 中有交互功能,它们将会丢失。在您可以遵循的所有可能示例中,您选择了最差的一个...