Compress existing PDF using C# programming using freeware libraries

前端 未结 4 2293
南旧
南旧 2021-02-12 11:52

I have been searching a lot on Google about how to compress existing pdf (size). My problem is

  1. I can\'t use any application, because it needs to b

4条回答
  •  星月不相逢
    2021-02-12 12:24

    I think you might want to make your clients aware that any of the libraries you mentioned is not completely free:

    • iTextSharp is AGPL-licensed, so you must release source code of your solution or buy a commercial license.
    • PDFcompressNET is a commercial library.
    • pdftk is GPL-licensed, so you must release source code of your solution or buy a commercial license.
    • Docotic.Pdf is a commercial library.

    Given all of the above I assume I can drop freeware requirement.

    Docotic.Pdf can reduce size of compressed and uncompressed PDFs to different degrees without introducing any destructive changes.

    Gains depend on the size and structure of a PDF: For small files or files that are mostly scanned images the reduction might not be that great, so you should try the library with your files and see for yourself.

    If you are most concerned about size and there are many images in your files and you are fine with loosing some of the quality of those images then you can easily recompress existing images using Docotic.Pdf.

    Here is the code that makes all images bilevel and compressed with fax compression:

    static void RecompressExistingImages(string fileName, string outputName)
    {
        using (PdfDocument doc = new PdfDocument(fileName))
        {
            foreach (PdfImage image in doc.Images)
                image.RecompressWithGroup4Fax();
    
            doc.Save(outputName);
        }
    }
    

    There are also RecompressWithFlate, RecompressWithGroup3Fax and RecompressWithJpeg methods.

    The library will convert color images to bilevel ones if needed. You can specify deflate compression level, JPEG quality etc.

    Docotic.Pdf can also resize big images (and recompress them at the same time) in PDF. This might be useful if images in a document are actually bigger then needed or if quality of images is not that important.

    Below is a code that scales all images that have width or height greater or equal to 256. Scaled images are then encoded using JPEG compression.

    public static void RecompressToJpeg(string path, string outputPath)
    {
        using (PdfDocument doc = new PdfDocument(path))
        {
            foreach (PdfImage image in doc.Images)
            {
                // image that is used as mask or image with attached mask are
                // not good candidates for recompression
                if (!image.IsMask && image.Mask == null && (image.Width >= 256 || image.Height >= 256))
                    image.Scale(0.5, PdfImageCompression.Jpeg, 65);
            }
    
            doc.Save(outputPath);
        }
    }
    

    Images can be resized to specified width and height using one of the ResizeTo methods. Please note that ResizeTo method won't try to preserve aspect ratio of images. You should calculate proper width and height yourself.

    Disclaimer: I work for Bit Miracle.

提交回复
热议问题