Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.Net中使用ITetSharp减少PDF大小_C#_.net_Pdf_Itext - Fatal编程技术网

C# 在.Net中使用ITetSharp减少PDF大小

C# 在.Net中使用ITetSharp减少PDF大小,c#,.net,pdf,itext,C#,.net,Pdf,Itext,我正在使用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) {

我正在使用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;
    }
private bool CreatePdf(字符串stFilePath\u in,列表lstmagedata\u in,字符串doctype,字符串stproCompid)
{
布尔标志=假;
StringBuilder=新的StringBuilder();
尝试
{
此.UtilityProgress(lstImageData_in.计数);
builder.Append(stFilePath_in);
builder.Append(@“\”);
builder.Append(在[0]中的lstmagedata_.条形码);
附加(“.pdf”);
文件=新文件(PageSize.LETTER,10f,10f,42f,35f);
GetInstance(文档,新文件流(builder.ToString(),FileMode.OpenOrCreate));
document.Open();
IOrderedEnumerable enumerable=来自中的lstImageData\u中的文件
orderby files.PageNo
选择文件;
if(可枚举!=null)
{
DbFileData数据2;
foreach(可枚举的ImageData数据)
{
位图位图=新位图(data.FilePath);
iTextSharp.text.Image实例=iTextSharp.text.Image.GetInstance(位图,ImageFormat.Png);
如果(instance.Height>instance.Width)
{
float num=0f;
num=700f/实例高度;
实例.缩放百分比(num*100f);
}
其他的
{
浮点数m2=0f;
num2=540f/实例宽度;
实例.比例百分比(num2*100f);
}
例如:Border=15;
instance.BorderColor=BaseColor.BLACK;
instance.BorderWidth=3f;
添加(实例);
document.NewPage();
Dispose();
}
document.Close();
如果(doctype==“AR”)
{
//[0].Barcode.Substring(2)中的data2.m_stInvoiceNo=lstmagedata_;
[0].Barcode.ToString()中的data2.m_stInvoiceNo=lstmagedata_;
data2.m_doctype=“AR”;
}
其他的
{
[0].Barcode.ToString()中的data2.m_stInvoiceNo=lstmagedata_;
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;
此.OnPdfFileCreationCompleted(数据2);
返回true;
}
flag=false;
}
捕获(异常)
{
flag=false;
StringBuilder builder2=新的StringBuilder();
builder2.Append(builder.ToString());
builder2.Append(“:\t”);
builder2.Append(exception.Message);
this.m_excepLogger.LogException(builder2.ToString());
}
返回标志;
}

OP创建iTextSharp
图像
对象,如下所示:

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);

data.FilePath
实际上是包含本地文件系统中文件路径的字符串吗?如果是的话,有没有理由不简单地使用
iTextSharp.text.Image.GetInstance(data.FilePath)
?因为您的
iTextSharp.text.Image.GetInstance(bitmap,ImageFormat.Png)
有效地将每个图像转换为Png,在JPEG的情况下,这通常意味着大小的爆炸。这太棒了!以我所寻找的方式工作。当然是数据。文件路径包含本地系统文件。非常感谢@mklOk,我将给出一个实际的答案,而不仅仅是一个评论。