首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >切片PDF文档

切片PDF文档
EN

Stack Overflow用户
提问于 2013-09-23 14:50:12
回答 1查看 759关注 0票数 1

如何在c#中切片pdf文档..这是我的切片代码,但是在切片后对10MB的pdf文档进行切片时,总大小是20MB,如何在切片时减少切片文档?请给出一个好的切片和压缩的方法

代码语言:javascript
复制
public int ExtractPages(string sourcePdfPath)
    {
        int p = 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(sourcePdfPath.ToLower().Replace(".pdf", "")))
            {
                Directory.CreateDirectory(sourcePdfPath.ToLower().Replace(".pdf", ""));
            }
            else
            {
                Directory.Delete(sourcePdfPath.ToLower().Replace(".pdf", ""), true);
                Directory.CreateDirectory(sourcePdfPath.ToLower().Replace(".pdf", ""));
            }

            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(sourcePdfPath.ToLower().Replace(".pdf", "") + "/" + p + ".pdf", memoryStream.ToArray());
                }
            }
            reader.Close();
            reader.Dispose();
        }
        catch
        {
        }
        finally
        {
            GC.Collect();
        }
        return p - 1;
EN

回答 1

Stack Overflow用户

发布于 2013-09-25 03:31:51

PDF使用资源的概念进行操作。文档中任何占用大量内存的对象通常都被认为是可以在整个文档中共享的资源。可共享资源的类型包括字体、图像、页面模板(表单,而不是AcroForms)、色彩空间、图形状态对象、图案和proc集。如果我在第1页、第2页、第3页和第4页上使用字体篮球过度扩展,则只需要在文件中嵌入一个篮球过度扩展的副本。

当您将文档分成4个不同的页面时,iText将完全按照您的要求进行操作:将字体嵌入到每个文件中。

由于字体通常很大,这很可能是文件显得臃肿的原因。

如果您希望文档在任何位置都能正确呈现,这是正确的做法。

这并不是说没有选择。例如,如果iText足够聪明,它可能能够为每个页面生成一个字体子集-换句话说,分析您的字体使用情况,并仅嵌入实际使用的字体部分。

您也可以完全删除字体嵌入。只要您留下度量和字体描述符,Acrobat就会非常努力地为您生成等效字体,甚至在目标系统上可用的情况下使用正确的字体,但是如果文档使用深奥的字体,祝您好运-您的最终用户将看到一个看起来完全错误的文档。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18953274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档