也许我要比现在更难,但是我花了很多时间将所有内容放在一起,甚至出现在我的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, 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();
}
}
答案 0 :(得分:0)
我没有继续与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;
}