【问题标题】:Reduce PDF size using iTetstSharp in .Net在 .Net 中使用 iTetstSharp 减小 PDF 大小
【发布时间】:2017-07-04 00:17:03
【问题描述】:

我正在使用 iTextSharp dll 将 Jpeg 或 Png 图像的数量转换为 PDF。我可以转换,但 PDF 的大小令人担忧。如果我将 9 个 jpeg 图像(总大小为 4.5 MB)转换为单个 pdf ,它将创建 12.3 MB 大小的 PDF。下面是转换部分。

private bool CreatePdf(string stFilePath_in, List<ImageData> lstImageData_in, string doctype, string stproCompid)
    {
        bool flag = false;
        StringBuilder builder = new StringBuilder();
        try
        {
            this.UtilityProgress(lstImageData_in.Count);
            builder.Append(stFilePath_in);
            builder.Append(@"\");
            builder.Append(lstImageData_in[0].Barcode);
            builder.Append(".pdf");
            Document document = new Document(PageSize.LETTER, 10f, 10f, 42f, 35f);
            PdfWriter.GetInstance(document, new FileStream(builder.ToString(), FileMode.OpenOrCreate));
            document.Open();
            IOrderedEnumerable<ImageData> enumerable = from files in lstImageData_in
                                                       orderby files.PageNo
                                                       select files;
            if (enumerable != null)
            {
                DbFileData data2;
                foreach (ImageData data in enumerable)
                {
                    Bitmap bitmap = new Bitmap(data.FilePath);
                    iTextSharp.text.Image instance = iTextSharp.text.Image.GetInstance(bitmap, ImageFormat.Png);
                    if (instance.Height > instance.Width)
                    {
                        float num = 0f;
                        num = 700f / instance.Height;
                        instance.ScalePercent(num * 100f);
                    }
                    else
                    {
                        float num2 = 0f;
                        num2 = 540f / instance.Width;
                        instance.ScalePercent(num2 * 100f);
                    }
                    instance.Border = 15;
                    instance.BorderColor = BaseColor.BLACK;
                    instance.BorderWidth = 3f;
                    document.Add(instance);
                    document.NewPage();
                    bitmap.Dispose();
                }
                document.Close();
                if (doctype == "AR")
                {
                    //data2.m_stInvoiceNo = lstImageData_in[0].Barcode.Substring(2);
                    data2.m_stInvoiceNo = lstImageData_in[0].Barcode.ToString();
                    data2.m_doctype = "AR";
                }
                else
                {
                    data2.m_stInvoiceNo = lstImageData_in[0].Barcode.ToString();
                    data2.m_doctype = "PO";
                }
                data2.m_stImgLocation = builder.ToString();
                string str = DateTime.Now.ToString("MM/dd/yy,hh:mm:ss");
                data2.m_dtDate = DateTime.Now.Date;
                data2.m_stTime = str.Substring(str.IndexOf(",") + 1);
                data2.m_stcompid = stproCompid;
                this.OnPdfFileCreationCompleted(data2);
                return true;
            }
            flag = false;
        }
        catch (Exception exception)
        {
            flag = false;
            StringBuilder builder2 = new StringBuilder();
            builder2.Append(builder.ToString());
            builder2.Append(": \t");
            builder2.Append(exception.Message);
            this.m_excepLogger.LogException(builder2.ToString());
        }
        return flag;
    }

【问题讨论】:

  • data.FilePath 实际上是一个包含本地文件系统中文件路径的字符串吗?如果是,您是否有理由不简单地使用iTextSharp.text.Image.GetInstance(data.FilePath)?因为您的 iTextSharp.text.Image.GetInstance(bitmap, ImageFormat.Png) 有效地将每张图片转换为 PNG,如果是 Jpeg,这通常意味着尺寸爆炸。
  • 太棒了!以我正在寻找的方式工作。当然是 data.Filepath 包含本地系统文件。非常感谢@mkl
  • 好的,我将把它作为一个实际的答案,而不是仅仅发表评论。

标签: c# .net pdf itext


【解决方案1】:

OP 像这样创建 iTextSharp Image 对象:

Bitmap bitmap = new Bitmap(data.FilePath);
iTextSharp.text.Image instance = iTextSharp.text.Image.GetInstance(bitmap, ImageFormat.Png);

这实际上意味着将原始图像文件解码为位图,然后要求 iTextSharp 像使用 PNG 图像一样使用该位图。

对于 JPG 图像,这通常意味着存储图像所需的数据量会激增。

为了防止这种大小爆炸,应该允许 iTextSharp 在手头的上下文中直接使用原始图像文件数据:

iTextSharp.text.Image instance = iTextSharp.text.Image.GetInstance(data.FilePath);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-18
    • 2016-02-20
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    相关资源
    最近更新 更多