我正在尝试将我的图片插入现有的pdf。我只是通过这个简单的代码来实现它:
private void insertBarCodesToPDF(System.Drawing.Image barcode)
{
PdfContentByte conent = mPdfStamper.GetOverContent(2);
byte[] barcodeArray = (byte[]) new ImageConverter().ConvertTo(barcode, typeof(byte[]));
iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(barcodeArray);
iTextSharp.text.Rectangle rect = mPdfStamper.Reader.GetPageSize(2);
image.SetAbsolutePosition(rect.Right - BARCODE_ONLISTPOSITION_X, rect.Top - BARCODE_ONLISTPOSITION_Y);
conent.AddImage(image);
mPdfStamper.Close();
mPdfReader.Close();
}
但是在添加之后,我的图像质量非常差,尺寸增加。看看这个:
如果我使用save()方法将图像保存到某处,这就是我需要的以及我得到的结果:
这就是我用PDF获得的内容
问题是什么?有什么想法吗?
P.S。原始图像尺寸为138x60,分辨率设置为72dpi。
答案 0 :(得分:1)
您正在创建一个System.Drawing.Bitmap
,这意味着您拥有绝对固定像素,如果未按预期分辨率显示,则总是看起来很奇怪。正如@mkl上面所说,您可以尝试提高源图像的有效DPI。从.Net的角度来看,你可以忽略" DPI"并且只是做更大规模的一切。我开始将你的尺寸乘以5给你690x300,看看它是否合适。当您添加新的较大图像时,您需要将其缩小,这是有效DPI的来源。
image.ScaleToFit(138, 60);
如果您使用条形码生成代码,这是唯一真正的解决方案。但是,正如@rufanov所说, 方式更好的 方法实际上是使用真正的基于矢量的条形码而且iText就是这样的!您的barcdoe似乎是ITF条形码,因此您只需使用iTextSharp.text.pdf.BarcodeInter25
即可。下面的代码使用" Arial Unicode MS"来绘制条形码。字体,因为PDF附带的默认Helvetica不支持西里尔字符。但是,您可以将此字体更改为您要使用的任何字体。您需要重新调整矩形以匹配您的代码,否则它应该可以正常工作和扩展。
//We need a font that supports Cyrillic glyphs
var fontFile = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "ARIALUNI.TTF");
//Create an iText font that uses this font
var bf = BaseFont.CreateFont(fontFile, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
//Create our barcode
var B = new iTextSharp.text.pdf.BarcodeInter25();
//Set the font
B.Font = bf;
//Set the text, you might need to play with the whitespace
B.Code = "693000 78 00700 4";
//Generate an iTextSharp image which is vector-based
var img = B.CreateImageWithBarcode(writer.DirectContent, BaseColor.BLACK, BaseColor.BLACK);
//Shrink the image to fit specific bounds
img.ScaleToFit(100, 100);
//The barcode above doesn't support drawing text on top but we can easily do this
//Also, the OP is using a PdfStamper so this easily works with that path, too
//Create a ColumnText object bound to a canvas.
//For a PdfStamper this would be something like mPdfStamper.GetOverContent(2)
var ct = new ColumnText(writer.DirectContent);
//Set the boundaries of the object
ct.SetSimpleColumn(100, 400, 300, 600);
//Add our text using our specified font and size
ct.AddElement(new Paragraph("ПОЧТА РОССИИ", new iTextSharp.text.Font(bf, 10)));
//Add our barcode
ct.AddElement(img);
//Draw the barcode onto the canvas
ct.Go();