微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用iTextSharp将文本,图像,图片和条形码添加到PDF

如何解决使用iTextSharp将文本,图像,图片和条形码添加到PDF

也许我要比现在更难,但是我花了很多时间将所有内容放在一起,甚至出现在我的pdf文件中。

在我的代码中,CreatePdf一次被称为创建徽章正面,然后一次被称为徽章背面。 pdf的所有对象部分都存储在数据库中,然后以这种方法循环遍历。

原始方法仅使用'graph'对象创建pdf,而使用iText CreateDrawingImage生成的条形码效果很好...除了所有条形码都非常模糊之外。为了解决这个问题,该方法已更改为使用CreateImageWithBarcode同时使用图形对象和iText图像。

问题是,无论我对iText图像做什么,它都不会在pdf上进行布局。条形码应该位于徽章的底部,但是使用iText图像,条形码会将其自身移动到pdf的顶部,即图形项目的顶部。

当我将所有不同的项目类型更改为全部使用iText图像时,没有正确布局,甚至没有显示在pdf上。

我希望使用图形将其全部布局,但是iText CreateDrawingImage的结果不可用。在switch语句的下面,“ C128”,“ Code39”和“ I25”是我遇到的问题。如果有人知道我如何解决这些问题以布置干净的徽章,将不胜感激。如果可以通过干净的方法使CreateDrawingImage创建清晰的条形码,则将是首选。

使用iTextSharp 5.5.13.1在VS 2019 C#中进行开发

    private byte[] CreatePDF(BadgeLayoutDTO badgeLayout,Document doc,PdfContentByte cb)
    {
        if (badgeLayout == null)
            return null;

        var width = Convert.ToInt32(badgeLayout.Width);
        var height = Convert.ToInt32(badgeLayout.Height);

        var offset = -50;

        // Create the new bitmap
        using (Image image = new Bitmap(width,height))
        {
            var graph = Graphics.FromImage(image);

            // Draw a border around the badge if specified
            if (badgeLayout.Outline > 0)
            {
                var pen = new Pen(Brushes.Black,badgeLayout.Outline);
                graph.DrawRectangle(pen,width - 1,height - 1);
            }

            foreach (var field in badgeLayout.BdgFieldList.OrderBy(x => x.FldPosition.FldTop))
            {
                var x = Convert.ToInt32(field.FldPosition.FldLeft * RatioHorz + badgeLayout.OffsetHorz / 2);
                var y = Convert.ToInt32(field.FldPosition.FldTop * RatioVert + badgeLayout.OffsetVert / 2);
                var w = Convert.ToInt32((field.FldPosition.FldRight - field.FldPosition.FldLeft) * RatioHorz);
                var h = Convert.ToInt32((field.FldPosition.FldBottom - field.FldPosition.FldTop) * RatioVert);

                switch (field.FldType)
                {
                    case "ShadedRoundRectangle":
                    case "RoundRect":
                    {
                        const float xradius = 5;
                        const float yradius = 5;
                        var brush = new SolidBrush(AccesstoHex(field.FldColor.BkColor)); // Fill Color
                        var pen = new Pen(AccesstoHex(field.FldColor.ForeColor),field.FldPosition.FldSize + 3); // Border color
                        var rect = new System.Drawing.Rectangle(x,y,w,h);

                        using (pen)
                        {
                            var path = MakeRoundedRect(rect,xradius,yradius,true,true);
                            graph.FillPath(brush,path);
                            graph.DrawPath(pen,path);
                        }

                        break;
                    }
                    case "ShadeRect":
                    {
                        var brush = new HatchBrush(HatchStyle.Cross,AccesstoHex(field.FldColor.BkColor - 100),AccesstoHex(field.FldColor.BkColor));
                        var pen = new Pen(AccesstoHex(field.FldColor.ForeColor),h);
                        graph.DrawRectangle(pen,rect);
                        graph.FillRectangle(brush,rect);

                        break;
                    }
                    case "Rectangle":
                    {
                        var brush = new SolidBrush(AccesstoHex(field.FldColor.BkColor));
                        var pen = new Pen(AccesstoHex(field.FldColor.ForeColor),rect);

                        break;
                    }
                    case "Ellipse":
                    {
                        var brush = new SolidBrush(AccesstoHex(field.FldColor.BkColor));
                        var pen = new Pen(AccesstoHex(field.FldColor.ForeColor),h);
                        graph.DrawEllipse(pen,rect);
                        graph.FillEllipse(brush,rect);

                        break;
                    }
                    case "ShadedEllipse":
                    {
                        var brush = new HatchBrush(HatchStyle.Cross,rect);

                        break;
                    }
                    case "Image":
                    {
                        if (field.FldData?.FldDataValue == null)
                            continue;

                            var dbimage = _filePicture.Get(field.FldData.FldDataValue.ToString(),36);

                            //var imageJ = iTextSharp.text.Image.GetInstance(dbimage.FileImage);
                            //imageJ.SetAbsolutePosition(x,y + offset);

                            //var rect = new Rectangle(0,h);
                            //imageJ.ScaletoFit(rect);

                            //doc.Add(imageJ);

                            using (var ms = new MemoryStream(dbimage.FileImage))
                            {
                                var newImage = Image.FromStream(ms);

                                // Resize image to proper aspect ratio
                                var aspect = ResizeKeepAspect(newImage.Size,h);
                                var aspectimage = ResizeImage(newImage,new Size(aspect.Width,aspect.Height));

                                // Create Point for upper-left corner of image.
                                var ulCorner = new Point(x,y);

                                // Draw image to screen.
                                graph.DrawImage(aspectimage,ulCorner);
                            }

                            break;
                    }
                    case "QRCode":
                    {
                        if (field.FldData?.FldDataValue == null)
                            continue;

                        QRCodeGenerator qrGenerator = new QRCodeGenerator();
                        QRCodeData qrCodeData = qrGenerator.CreateQrCode(field.FldData?.FldDataValue.ToString(),QRCodeGenerator.Ecclevel.Q);
                        QRCode qrCode = new QRCode(qrCodeData);
                        Bitmap dbImage = qrCode.GetGraphic(20);
                        var aspect = ResizeKeepAspect(dbImage.Size,h);
                        var aspectimage = ResizeBadgeImage(dbImage,aspect.Height));
                        using (var ms2 = new MemoryStream())
                        {
                            try
                            {
                                aspectimage.Save(ms2,System.Drawing.Imaging.ImageFormat.Jpeg);
                                var signatureImage = iTextSharp.text.Image.GetInstance(ms2.ToArray());
                                signatureImage.SetAbsolutePosition(x,y + offset - 100);
                                doc.Add(signatureImage);
                            }
                            catch (Exception e)
                            {
                                Console.WriteLine(e);
                            }
                        }
                        break;
                    }
                    case "C128":
                    {
                        if (field.FldData?.FldDataValue == null)
                            continue;

                        var dbImage = (new Barcode128()
                        {
                            Code = field.FldData?.FldDataValue.ToString()
                        });

                        iTextSharp.text.Image image128 = dbImage.CreateImageWithBarcode(cb,null,BaseColor.WHITE);
                        image128.SetAbsolutePosition(x,y + offset);
                        var rect = new Rectangle(0,h);
                        image128.ScaletoFit(rect);
                        doc.Add(image128);
                        break;
                    }
                    case "Code39":
                    {
                        if (field.FldData?.FldDataValue == null)
                            continue;

                        var dbImage = (new Barcode39
                        {
                            Code = field.FldData?.FldDataValue.ToString()
                        });

                        iTextSharp.text.Image image128 = dbImage.CreateImageWithBarcode(cb,h);
                        image128.ScaletoFit(rect);

                        doc.Add(image128);
                        break;
                    }
                    case "I25":
                    {
                        if (field.FldData?.FldDataValue == null)
                            continue;

                        var dbImage = (new BarcodeInter25()
                        {
                            Code = field.FldData?.FldDataValue.ToString()
                        });

                        iTextSharp.text.Image image128 = dbImage.CreateImageWithBarcode(cb,y + offset);

                        var rect = new Rectangle(0,h);
                        image128.ScaletoFit(rect);

                        doc.Add(image128);
                        break;
                    }
                    case "Picture":
                    {
                        if (field.FldData?.FldDataValue == null)
                            continue;

                        var dbimage = _filePicture.Get(field.FldData.FldDataValue.ToString(),48);

                        //var imageJ = iTextSharp.text.Image.GetInstance(dbimage.FileImage);
                        //imageJ.SetAbsolutePosition(x,y + offset);

                        //var rect = new Rectangle(0,h);
                        //imageJ.ScaletoFit(rect);

                        //doc.Add(imageJ);
                        using (var ms = new MemoryStream(dbimage.FileImage))
                        {
                            var newImage = Image.FromStream(ms);

                            // Resize image to proper aspect ratio
                            var aspect = ResizeKeepAspect(newImage.Size,h);
                            var aspectimage = ResizeImage(newImage,aspect.Height));

                            //var rect = new Rectangle(0,h);

                            // Create Point for upper-left corner of image.
                            var ulCorner = new Point(x,y);

                            // Draw image to screen.
                            graph.DrawImage(aspectimage,ulCorner);
                        }

                        break;
                    }
                    case "Signature":
                    {
                        if (field.FldData?.FldDataValue == null)
                            continue;

                        var dbimage = _filePicture.Get(field.FldData.FldDataValue.ToString(),36);

                        if (dbimage == null) continue;

                            //iTextSharp.text.Image imageJ = new Jpeg(dbimage.FileImage);
                            //imageJ.SetAbsolutePosition(x,h);
                            //imageJ.ScaletoFit(rect);

                            //doc.Add(imageJ);

                        using (var ms = new MemoryStream(dbimage.FileImage))
                        {
                            var newImage = Image.FromStream(ms);

                            // Resize image to proper aspect ratio
                            var aspect = ResizeKeepAspect(newImage.Size,aspect.Height));

                            // Create Point for upper-left corner of image.
                            var ulCorner = new Point(x,ulCorner);
                        }

                        break;
                    }
                    case "TextCenter":
                    case "TextLeft":
                    case "TextRight":
                    {
                            var text = GetText(field);

                            // Assume here that screen DPI is 96...
                            // If DPI is different,rendering issues might occur...
                            // Badge designer in Desktop assumes 300 DPI
                            var fontSizeDpiRatioFix = 300 / 96; //HACK
                            var fontSize = -field.FldPosition.FldSize * fontSizeDpiRatioFix * 1.03;
                            Font font;
                            try
                            {
                                font = FindFont(graph,text,new Size(w,h),new Font(new FontFamily(field.FldFont.FontName),(float)fontSize,GetFontParam(field.FldFont.FontParms)));
                            }
                            catch (Exception exc)
                            {
                                font = System.Drawing.SystemFonts.DefaultFont;
                            }

                            //Create rectangles
                            var rect1 = new System.Drawing.Rectangle(x,h);

                            //Construct string format and alignment
                            var strFormat1 = new StringFormat
                            {
                                Alignment = Stringalignment.Center,LineAlignment = Stringalignment.Center,Trimming = StringTrimming.EllipsisCharacter
                            };

                            // Draw GDI+ objects
                            graph.DrawRectangle(new Pen(Color.Transparent),rect1);
                            graph.DrawString(text,font,new SolidBrush(AccesstoHex(field.FldColor.ForeColor)),rect1,strFormat1);

                            //disposes of objects
                            font.dispose();

                            break;
                        }
                }
            }

            using (var ms = new MemoryStream())
            {
                image.Save(ms,ImageFormat.Png);
                return ms.ToArray();
            }
        }

解决方法

我没有继续与iTextSharp条形码进行斗争,而是安装了Nugget的IronBarCodes,并迅速能够仅用几行代码就能获得清晰,干净的条形码。生成的条形码具有导出为位图的功能,使我能够使用pdf其余部分使用的图形布局。问题解决了。

解决方案摘要:

                    case "C128":
                    {
                        if (field.FldData?.FldDataValue == null)
                            continue;

                        var myBarCode = BarcodeWriter.CreateBarcode(field.FldData?.FldDataValue.ToString(),BarcodeEncoding.Code128)
                            .ResizeTo(w,h).ToBitmap();

                        // Create Point for upper-left corner of image.
                        var ulCorner = new Point(x,y);

                        // Draw image to screen.
                        graph.DrawImage(myBarCode,ulCorner);
                        break;
                    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。