1

我在 Visual Studio 2010 中使用带有 C# 的 iTextSharp,我最近遇到了以下情况。我收到了几本分成许多 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();

当然,这包含在以 i 为序数的 For 循环中。在我遍历我正在处理的部分中的每个页面之后,我使用以下代码将它们合并在一起:

    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%。

话虽如此,有谁知道使用 iTextSharp 从 PDF 中删除嵌入字体的方法。我的计划是仅将它们包含在第一个 PDF 文件中,然后当重新编译 PDF 时,文档中将只有一个字体副本,我的尺寸会更合适。

另外值得注意的是,这段代码与我的实际代码非常接近——逻辑是相同的,但出于大小和流量的考虑,添加了一些变量。

4

0 回答 0