在Asp.Net中操作PDF – iTextSharp - 操作圖片

ruichenf 8年前發布 | 33K 次閱讀 PDF工具包

來自: http://blog.csdn.net//chenguang79/article/details/41476353


轉自:http://www.cnblogs.com/CareySon/archive/2011/11/07/2239017.html

iTextSharp支持所有主流的圖片格式,比如:jpg, tif, gif, bmp, png和wmf.在iTextSharp中使用Image.GetInstance()方法創建圖片有很多種方式,或許最常用的方式應該是傳入文件的路徑和文件名到該方法中:

string pdfpath = Server.MapPath("PDFs");

string imagepath = Server.MapPath("Images");

Document doc = new Document();

try

{

PdfWriter.GetInstance(doc, new FileStream(pdfpath + "/Images.pdf", FileMode.Create));

doc.Open();

doc.Add(new Paragraph("GIF"));

Image gif = Image.GetInstance(imagepath + "/mikesdotnetting.gif");

doc.Add(gif);

}

catch (DocumentException dex)

{

Response.Write(dex.Message);

}

catch (IOException ioex)

{

Response.Write(ioex.Message);

}

catch (Exception ex)

{

Response.Write(ex.Message);

}

finally

{

doc.Close();

}</pre>

 

    1

 

    其他可以使用的構造函數的重載可以是傳入一個URL或是一個System.Drawing.Image對象(并不是iTextSharp.text.Image).

    注意:下面代碼段的System.Drawing.Image.FromStream()方法使用了命名空間的別名,在前面講述List的文章中就已經提到過,使用命名空間的別名以防止兩個不同Image類沖突:

doc.Add(new Paragraph("JPG"));

string url = "http://localhost:1805/PDF/Images/mikesdotnetting.jpg";

Image jpg = Image.GetInstance(new Uri(url));

doc.Add(jpg);

doc.Add(new Paragraph("PNG"));

using (FileStream fs = new FileStream(imagepath + "/mikesdotnetting.png", FileMode.Open))

{

Image png = Image.GetInstance(sd.Image.FromStream(fs),ImageFormat.Png);

doc.Add(png);

}</pre>

   2

 

   目前為止還不能辨別出我所提供的圖片哪個是JPG,哪個是PNG,但在PDF中的結果圖片分辨率并不好,在默認情況下,嵌入PDF的圖片是72 dpi(每英尺的點陣數),這種分辨率如果實在PDF需要打印出來時,就非常不夠了,一般來說,商業打印機需要的圖片最小分辨率為300dpi.為了達到這個效果,你可以將72dpi的圖片縮小至原圖片的24%.實際上你是將原來300像素的圖片縮小為72像素:72/300 * 100 = 24%。這時嵌入pdf的圖片從大小來說一模一樣,但是在文檔占用方面卻少了很多:

doc.Add(new Paragraph("TIF Scaled to 300dpi"));

Image tif = Image.GetInstance(imagepath + "/mikesdotnetting.tif");

tif.ScalePercent(24f);

doc.Add(tif);</pre>

    3

 

    現在,我有一個比較大的圖片想作為logo放在pdf中,這個圖片大小為:300x890像素,所以在72dpi的情況下,這個圖片占用4.17英尺寬,12.36英尺高。如果將圖片的分辨率改為300dpi的話,那圖片的占用就會變成1英尺寬,2.97英尺高.如果僅僅是實現這個功能的話,上面給出的代碼已經可以達到這個功能。但是,現在我想將這個圖片放到PDF中的特定位置,也就是右上方,使用SetAbsolutePosition()這個方法可以實現這個目標,但我還需要計算絕對位置.

 

    SetAbsolutePosition()方法接受兩個float類型的參數,第一個參數是X軸坐標,是從文檔最左邊開始算起,第二個參數是Y軸坐標,是從文檔下方開始算起。A4紙的的默認參數是595像素寬,842像素高,四周的頁邊距都為36像素.

 

    傳入的坐標參數點實際上是圖片的左下角坐標。圖片距離右邊的距離為寬度72像素(1英尺)+頁邊距36像素(總共108像素),所以X的坐標為595-108=487.對于Y軸來說,和X軸坐標的計算方法大同小異,Y軸坐標為842 - (213.6 + 36) = 592.4.實際上我并不需要知道所有紙張類型的大小來做數學題,雖然我需要設置圖片在文中的絕對值。幸運的是,我可以使用Document.PageSize對象來幫我記住這個數字:

Image tif = Image.GetInstance(imagepath + "/verticallogo.tif");

tif.ScalePercent(24f);

tif.SetAbsolutePosition(doc.PageSize.Width - 36f - 72f, doc.PageSize.Height - 36f - 216.6f);

doc.Add(tif);</pre>doc.PageSize.Width告訴我文檔的寬度為多少像素,我僅僅是從這個寬度中減去了圖片寬度(72px)和頁邊距(36px).Y軸坐標的設置方法也是遵循了同樣的方法:

 

    4

 

   將我公司的Logo放進去了:-)

 

   還有的應用場景比如說,你需要在PDF中為用戶上傳的圖片提供一個容器。我使用WinXp中默認帶的示例圖片“日落”來說明如何使用ScaleToFit()方法實現這個效果.下面代碼展示了如何改變一個800 * 600的圖片大小,在不改變其縱橫比的情況下將其放入一個250像素長的正方形容器中:

Image jpg = Image.GetInstance(imagepath + "/Sunset.jpg");

jpg.ScaleToFit(250f, 250f);

jpg.Border = Rectangle.BOX;

jpg.BorderColor = Color.YELLOW;

jpg.BorderWidth = 5f;

doc.Add(jpg);

doc.Add(new Paragraph("Original Width: " + jpg.Width.ToString()));

doc.Add(new Paragraph("Original Height " + jpg.Height.ToString()));

doc.Add(new Paragraph("Scaled Width: " + jpg.ScaledWidth.ToString()));

doc.Add(new Paragraph("Scaled Height " + jpg.ScaledHeight.ToString()));

float Resolution = jpg.Width / jpg.ScaledWidth * 72f;

doc.Add(new Paragraph("Resolution: " + Resolution));</pre>
上面代碼中,我還為嵌入的圖片加上了一個5像素寬的黃色邊框.并且在下面顯示了縮放前和縮放后的大小,還有圖片的分辨率,下面是結果:

 

    4

   

    如果你使用SetAbsolutePosition()方法和設置Image.UNDERLYING所得到的效果一樣的話,除非你想對圖片設置水印什么的,否則還是設置Image.TEXTWRAP比較好:

Image jpg = Image.GetInstance(imagepath + "/Sunset.jpg");

Paragraph paragraph = new Paragraph(@"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Suspendisse blandit blandit turpis. Nam in lectus ut dolor consectetuer bibendum. Morbi neque ipsum, laoreet id; dignissim et, viverra id, mauris. Nulla mauris elit, consectetuer sit amet, accumsan eget, congue ac, libero. Vivamus suscipit. Nunc dignissim consectetuer lectus. Fusce elit nisi; commodo non, facilisis quis, hendrerit eu, dolor? Suspendisse eleifend nisi ut magna. Phasellus id lectus! Vivamus laoreet enim et dolor. Integer arcu mauris, ultricies vel, porta quis, venenatis at, libero. Donec nibh est, adipiscing et, ullamcorper vitae, placerat at, diam. Integer ac turpis vel ligula rutrum auctor! Morbi egestas erat sit amet diam. Ut ut ipsum? Aliquam non sem. Nulla risus eros, mollis quis, blandit ut; luctus eget, urna. Vestibulum vestibulum dapibus erat. Proin egestas leo a metus?");

paragraph.Alignment = Element.ALIGN_JUSTIFIED;

jpg.ScaleToFit(250f, 250f);

jpg.Alignment = Image.TEXTWRAP | Image.ALIGN_RIGHT;

jpg.IndentationLeft = 9f;

jpg.SpacingAfter = 9f;

jpg.BorderWidthTop = 36f;

jpg.BorderColorTop = Color.WHITE;

doc.Add(jpg);

doc.Add(paragraph);</pre>
   5

   

    上面例子中,我為圖片加上了白色的邊框并使其居于文本上方.并給圖片左方和下方加上了一些內襯距離使其不會緊貼文本.左邊和下邊的內襯距離可以通過設置IndentationLeft和IndentationRight屬性實現,也可以通過SpacingBefore和SpacingAfter來實現.你或許會疑惑我為什么設置白色邊框而不是設置SpacingBefore屬性,這是個好問題。實際上,我設置了SpacingBefore屬性在這個例子中不知道為什么不起作用。如果誰知道,請告訴我為什么,我很樂意知道。

 

    最后,如果你需要將圖片進行旋轉,可以通過Rotation屬性進行。這個屬性是float類型的變量用于表示圖片旋轉的弧度。如果你在學校數學比我學的好的話,下面的例子使用起來會讓你更舒服.如果你數學像我一樣爛并且見到下面例子會驚叫出”這是蝦米?”的話,你可以讀這篇關于度數的文章就能知道Math.PI /2實際上就是90度,或者是設置RotationDegrees屬性,這個屬性的度數是逆時針的.下面代碼中的兩種方法實現了相同的效果:

jpg.Rotation = (float)Math.PI / 2;

jpg.RotationDegrees = 90f;</pre>



 本文由用戶 ruichenf 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!