IiTextSharp为什么它调整我的图像大小并使其质量下降?

时间:2014-09-10 03:43:14

标签: c# image pdf itextsharp

我正在尝试将我的图片插入现有的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()方法将图像保存到某处,这就是我需要的以及我得到的结果:

What I need

这就是我用PDF获得的内容

enter image description here

问题是什么?有什么想法吗?

P.S。原始图像尺寸为138x60,分辨率设置为72dpi。

1 个答案:

答案 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();