我正在使用iTextSharp,在Visual Studio 2010中使用C#,我最近遇到了以下情况。我收到了几本分成许多PDF文件的电子书,这些文件包含边框中的厨房标记,我使用以下代码删除它们:
x = reader.GetPageSize(i).Width;
y = reader.GetPageSize(i).Height;
iTextSharp.text.Rectangle tRect =
new iTextSharp.text.Rectangle(x - 52, y - 52);
Document document = new Document(tRect);
PdfWriter writer = PdfWriter.GetInstance(document,
new FileStream(dest, FileMode.OpenOrCreate));
document.Open();
PdfContentByte content = writer.DirectContent;
PdfImportedPage page = writer.GetImportedPage(reader, i);
content.AddTemplate(page, -offset, -offset);
document.NewPage();
document.SetMargins(0, 0, 0, 0);
document.Close();
reader.Close();
当然,这被包含在一个For循环中,其中i作为序数。在我迭代完我正在处理的部分中的每个页面之后,我使用以下代码将它们合并在一起:
private void mergePDF(string fName, string folderPath)
{
string[] files = Directory.GetFiles(folderPath);
iTextSharp.text.Document tDoc = new iTextSharp.text.Document();
iTextSharp.text.pdf.PdfCopy copy =
new iTextSharp.text.pdf.PdfCopy(tDoc,
new FileStream(fName, FileMode.Create));
tDoc.Open();
iTextSharp.text.pdf.PdfReader reader;
int n = 0;
for (int i = 0; i < files.Length; i++)
{
reader = new iTextSharp.text.pdf.PdfReader(files[i]);
n = reader.NumberOfPages;
for (int page = 0; page < n; )
{
copy.AddPage(copy.GetImportedPage(reader, ++page));
}
copy.FreeReader(reader);
reader.Close();
}
tDoc.Close();
}
完成此操作后,我发现我的文件大小加倍(特别是一个文件在处理前为20,180KB,在处理后为41,322KB)!
我做了一些挖掘工作,似乎在使用iTextSharp分割PDF时,程序会在每个PDF中嵌入完整PDF的所有字体,并且显然这可以占文件大小的50-80%。< / p>
话虽如此,有没有人知道使用iTextSharp从PDF中删除嵌入字体的方法。我的计划是仅将它们包含在第一个PDF文件中,然后当PDF重新格式化时,文档中只会有一个字体副本,而且我的尺寸更合适。
另外值得注意的是,这段代码与我的实际代码非常接近 - 逻辑是相同的,但是为了大小和流量考虑,添加了一些变量。