簡體   English   中英

使用 iTextSharp 將文本、圖像、圖片和條形碼添加到 PDF

[英]Adding text, images, pictures and barcodes to a PDF using iTextSharp

也許我做得比現在更難,但我有很多時間把所有東西都放在一起,甚至出現在我的 pdf 上。

在我的代碼中, CreatePdf 被稱為單次創建徽章正面,然后是徽章背面的單次。 pdf 的所有對象部分都存儲在數據庫中,然后在此方法中循環。

原始方法僅使用“圖形”對象來創建 pdf,使用 iText CreateDrawingImage 生成的條碼效果很好......除了所有條碼都非常模糊。 為了解決這個問題,使用 CreateImageWithBarcode 將方法更改為同時使用圖形對象和 iText 圖像。

問題是,無論我對 iText 圖像做什么,它都不會在 pdf 上布局我想要的位置。 條形碼應該在徽章的底部,但是對於 iText 圖像,條形碼會移動到 pdf 的頂部,在圖形項目的頂部。

當我將所有不同的項目類型更改為全部使用 iText 圖像時,沒有任何內容正確布局,甚至沒有顯示在 pdf 上。

我更願意使用圖形來布置它,但是 iText CreateDrawingImage 的結果是不可用的。 在 switch 語句的下方,“C128”、“Code39”和“I25”是我遇到問題的項目。 如果有人知道我如何解決這些問題以布置干凈的徽章,將不勝感激。 如果有一種干凈的方法可以讓 CreateDrawingImage 創建清晰的條形碼,那將是首選。

在 VS 2019 C# 中開發,使用 iTextSharp 5.5.13.1

    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, 0, 0, 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, 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),
                            field.FldPosition.FldSize + 3); // Border color
                        var rect = new System.Drawing.Rectangle(x, y, w, 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),
                            field.FldPosition.FldSize + 3); // Border color
                        var rect = new System.Drawing.Rectangle(x, y, w, h);
                        graph.DrawRectangle(pen, rect);
                        graph.FillRectangle(brush, rect);

                        break;
                    }
                    case "Ellipse":
                    {
                        var brush = new SolidBrush(AccessToHex(field.FldColor.BkColor));
                        var pen = new Pen(AccessToHex(field.FldColor.ForeColor),
                            field.FldPosition.FldSize + 3); // Border color
                        var rect = new System.Drawing.Rectangle(x, y, w, h);
                        graph.DrawEllipse(pen, rect);
                        graph.FillEllipse(brush, rect);

                        break;
                    }
                    case "ShadedEllipse":
                    {
                        var brush = new HatchBrush(HatchStyle.Cross, AccessToHex(field.FldColor.BkColor - 100),
                            AccessToHex(field.FldColor.BkColor));
                        var pen = new Pen(AccessToHex(field.FldColor.ForeColor),
                            field.FldPosition.FldSize + 3); // Border color
                        var rect = new System.Drawing.Rectangle(x, y, w, h);
                        graph.DrawEllipse(pen, rect);
                        graph.FillEllipse(brush, 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, 0, w, 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, w, 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, w, h);
                        var aspectImage = ResizeBadgeImage(dbImage, new Size(aspect.Width, 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, 0, w, 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, null, BaseColor.WHITE);
                        image128.SetAbsolutePosition(x, y + offset);
                        var rect = new Rectangle(0, 0, w, 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, null, BaseColor.WHITE);
                        image128.SetAbsolutePosition(x, y + offset);

                        var rect = new Rectangle(0, 0, w, 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, 0, w, 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, w, h);
                            var aspectImage = ResizeImage(newImage, new Size(aspect.Width, aspect.Height));

                            //var rect = new Rectangle(0, 0, w, 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, y + offset);

                            //var rect = new Rectangle(0, 0, w, 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, w, 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 "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, y, w, 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;
                    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM