压缩拆分的 PDF 文件

本文关键字:文件 PDF 拆分 压缩 | 更新日期: 2023-09-27 18:31:48

如何在 c#..??

我有一个PDF文档。 我正在对该文件进行切片。 如果切片后的原始 PDF 文档大小 10 MB 增加到 15 MB。 这就是为什么我必须压缩切片文档的原因。 有什么方法可以压缩..?? 请帮助我..

public int ExtractPages(string sourcePdfPath, string DestinationFolder)
        {
            int p = 0, initialcount = 0;
            try
            {
                iTextSharp.text.Document document;
                iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(new iTextSharp.text.pdf.RandomAccessFileOrArray(sourcePdfPath), new ASCIIEncoding().GetBytes(""));
            if (!Directory.Exists(DestinationFolder))
            {
                Directory.CreateDirectory(DestinationFolder);
            }
            else
            {
                DirectoryInfo di = new DirectoryInfo(DestinationFolder);
                initialcount = di.GetFiles("*.pdf", SearchOption.AllDirectories).Length;
            }
            for (p = 1; p <= reader.NumberOfPages; p++)
            {
                using (MemoryStream memoryStream = new MemoryStream())
                {
                    document = new iTextSharp.text.Document();
                    iTextSharp.text.pdf.PdfWriter writer = iTextSharp.text.pdf.PdfWriter.GetInstance(document, memoryStream);
                    writer.SetPdfVersion(iTextSharp.text.pdf.PdfWriter.PDF_VERSION_1_2);
                    writer.CompressionLevel = iTextSharp.text.pdf.PdfStream.BEST_COMPRESSION;
                    writer.SetFullCompression();
                    document.SetPageSize(reader.GetPageSize(p));
                    document.NewPage();
                    document.Open();
                    document.AddDocListener(writer);
                    iTextSharp.text.pdf.PdfContentByte cb = writer.DirectContent;
                    iTextSharp.text.pdf.PdfImportedPage pageImport = writer.GetImportedPage(reader, p);
                    int rot = reader.GetPageRotation(p);
                    if (rot == 90 || rot == 270)
                    {
                        cb.AddTemplate(pageImport, 0, -1.0F, 1.0F, 0, 0, reader.GetPageSizeWithRotation(p).Height);
                    }
                    else
                    {
                        cb.AddTemplate(pageImport, 1.0F, 0, 0, 1.0F, 0, 0);
                    }
                    document.Close();
                    document.Dispose();
                    File.WriteAllBytes(DestinationFolder + "/" + p + ".pdf", memoryStream.ToArray());
                }
            }
            reader.Close();
            reader.Dispose();
        }
        catch
        {
        }
        finally
        {
            GC.Collect();
        }

        if (initialcount > (p - 1))
        {
            for (int k = (p - 1) + 1; k <= initialcount; k++)
            {
                try
                {
                    File.Delete(DestinationFolder + "/" + k + ".pdf");
                }
                catch
                {
                }
            }
        }
        return p - 1;
    }

压缩拆分的 PDF 文件

首先,

您不应该将PdfWriterGetImportedPage一起使用,而将其直接内容与手头的任务一起使用AddTemplate。相反,请看一下 Webized iTextSharp Example of iText in Action — 2nd Edition。

在那里,您将找到带有中心代码的示例 Burst.cs

PdfReader reader = new PdfReader(pdf);
// loop over all the pages in the original PDF
int n = reader.NumberOfPages;      
for (int i = 0; i < n; i++)
{
    using (MemoryStream ms = new MemoryStream())
    {
        // We'll create as many new PDFs as there are pages
        using (Document document = new Document())
        {
            using (PdfCopy copy = new PdfCopy(document, ms))
            {
                document.Open();
                copy.AddPage(copy.GetImportedPage(reader, i + 1));
            }
        }
        // store ms.ToArray() somewhere
    }
}

(我删除了一些ZIP文件,其中包含那些网络化示例使用。

如您所见,不再需要处理页面旋转或任何事情。

综上所述,单个文件的大小总和很可能大于原始文件的大小。毕竟,在原始文件中可以共享资源。例如,在所有页面上使用的字体只需要嵌入一次,而在拆分文档中,字体必须嵌入到每个单独的文档中,并带有使用该字体的页面。

PS:如果保留元信息很重要,您可能希望使用PdfReader.selectPagesPdfStamper。为此,我只有Java代码:

for (int i = 1; i <= TEST_FILE_PAGES; i++)
{
    FileOutputStream fos = new FileOutputStream(String.format("%03d.pdf", i));
    PdfReader reader = new PdfReader(TEST_FILE);
    reader.selectPages(Collections.singletonList(i));
    PdfStamper stamper = new PdfStamper(reader, fos);
    stamper.close();
    fos.close();
}

这会保留 PDF 元信息,因此根据您的要求可能更合适。但是,它要慢得多,因为对于每个页面导出,PdfReader内容都会作,因此必须重新读取才能导出下一页。