iTextSharp支持所有主流的图片格式,比如:jpg, tif, gif, bmp, png和wmf.在iTextSharp中使用Image.GetInstance()方法创建图片有很多种方式,或许最常用的方式应该是传入文件的路径和文件名到该方法中:

  1.  
    string pdfpath = Server.MapPath("PDFs");
  2.  
     
  3.  
    string imagepath = Server.MapPath("Images");
  4.  
     
  5.  
    Document doc = new Document();
  6.  
     
  7.  
    try
  8.  
     
  9.  
    {
  10.  
     
  11.  
    PdfWriter.GetInstance(doc, new FileStream(pdfpath + "/Images.pdf", FileMode.Create));
  12.  
     
  13.  
    doc.Open();
  14.  
     
  15.  
     
  16.  
     
  17.  
    doc.Add(new Paragraph("GIF"));
  18.  
     
  19.  
    Image gif = Image.GetInstance(imagepath + "/mikesdotnetting.gif");
  20.  
     
  21.  
    doc.Add(gif);
  22.  
     
  23.  
    }
  24.  
     
  25.  
    catch (DocumentException dex)
  26.  
     
  27.  
    {
  28.  
     
  29.  
    Response.Write(dex.Message);
  30.  
     
  31.  
    }
  32.  
     
  33.  
    catch (IOException ioex)
  34.  
     
  35.  
    {
  36.  
     
  37.  
    Response.Write(ioex.Message);
  38.  
     
  39.  
    }
  40.  
     
  41.  
    catch (Exception ex)
  42.  
     
  43.  
    {
  44.  
     
  45.  
    Response.Write(ex.Message);
  46.  
     
  47.  
    }
  48.  
     
  49.  
    finally
  50.  
     
  51.  
    {
  52.  
     
  53.  
    doc.Close();
  54.  
     
  55.  
    }

其他可以使用的构造函数的重载可以是传入一个URL或是一个System.Drawing.Image对象(并不是iTextSharp.text.Image).

注意:下面代码段的System.Drawing.Image.FromStream()方法使用了命名空间的别名,在前面讲述List的文章中就已经提到过,使用命名空间的别名以防止两个不同Image类冲突:

  1.  
    doc.Add(new Paragraph("JPG"));
  2.  
     
  3.  
    string url = "http://localhost:1805/PDF/Images/mikesdotnetting.jpg";
  4.  
     
  5.  
    Image jpg = Image.GetInstance(new Uri(url));
  6.  
     
  7.  
    doc.Add(jpg);
  8.  
     
  9.  
    doc.Add(new Paragraph("PNG"));
  10.  
     
  11.  
    using (FileStream fs = new FileStream(imagepath + "/mikesdotnetting.png", FileMode.Open))
  12.  
     
  13.  
    {
  14.  
     
  15.  
    Image png = Image.GetInstance(sd.Image.FromStream(fs),ImageFormat.Png);
  16.  
     
  17.  
    doc.Add(png);
  18.  
     
  19.  
    }

目前为止还不能辨别出我所提供的图片哪个是JPG,哪个是PNG,但在PDF中的结果图片分辨率并不好,在默认情况下,嵌入PDF的图片是72 dpi(每英尺的点阵数),这种分辨率如果实在PDF需要打印出来时,就非常不够了,一般来说,商业打印机需要的图片最小分辨率为300dpi.为了达到这个效果,你可以将72dpi的图片缩小至原图片的24%.实际上你是将原来300像素的图片缩小为72像素:72/300 * 100 = 24%。这时嵌入pdf的图片从大小来说一模一样,但是在文档占用方面却少了很多:

  1.  
    doc.Add(new Paragraph("TIF Scaled to 300dpi"));
  2.  
     
  3.  
    Image tif = Image.GetInstance(imagepath + "/mikesdotnetting.tif");
  4.  
     
  5.  
    tif.ScalePercent(24f);
  6.  
     
  7.  
    doc.Add(tif);

现在,我有一个比较大的图片想作为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对象来帮我记住这个数字:

  1.  
    Image tif = Image.GetInstance(imagepath + "/verticallogo.tif");
  2.  
     
  3.  
    tif.ScalePercent(24f);
  4.  
     
  5.  
    tif.SetAbsolutePosition(doc.PageSize.Width - 36f - 72f,
  6.  
    doc.PageSize.Height - 36f - 216.6f);
  7.  
     
  8.  
    doc.Add(tif);

doc.PageSize.Width告诉我文档的宽度为多少像素,我仅仅是从这个宽度中减去了图片宽度(72px)和页边距(36px).Y轴坐标的设置方法也是遵循了同样的方法:

将我公司的Logo放进去了:-)

还有的应用场景比如说,你需要在PDF中为用户上传的图片提供一个容器。我使用WinXp中默认带的示例图片“日落”来说明如何使用ScaleToFit()方法实现这个效果.下面代码展示了如何改变一个800 * 600的图片大小,在不改变其纵横比的情况下将其放入一个250像素长的正方形容器中:

  1.  
    Image jpg = Image.GetInstance(imagepath + "/Sunset.jpg");
  2.  
     
  3.  
    jpg.ScaleToFit(250f, 250f);
  4.  
     
  5.  
    jpg.Border = Rectangle.BOX;
  6.  
     
  7.  
    jpg.BorderColor = Color.YELLOW;
  8.  
     
  9.  
    jpg.BorderWidth = 5f;
  10.  
     
  11.  
    doc.Add(jpg);
  12.  
     
  13.  
    doc.Add(new Paragraph("Original Width: " + jpg.Width.ToString()));
  14.  
     
  15.  
    doc.Add(new Paragraph("Original Height " + jpg.Height.ToString()));
  16.  
     
  17.  
    doc.Add(new Paragraph("Scaled Width: " + jpg.ScaledWidth.ToString()));
  18.  
     
  19.  
    doc.Add(new Paragraph("Scaled Height " + jpg.ScaledHeight.ToString()));
  20.  
     
  21.  
    float Resolution = jpg.Width / jpg.ScaledWidth * 72f;
  22.  
     
  23.  
    doc.Add(new Paragraph("Resolution: " + Resolution));

上面代码中,我还为嵌入的图片加上了一个5像素宽的黄色边框.并且在下面显示了缩放前和缩放后的大小,还有图片的分辨率,下面是结果:

如果你使用SetAbsolutePosition()方法和设置Image.UNDERLYING所得到的效果一样的话,除非你想对图片设置水印什么的,否则还是设置Image.TEXTWRAP比较好:

  1.  
    Image jpg = Image.GetInstance(imagepath + "/Sunset.jpg");
  2.  
     
  3.  
    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?");
  4.  
     
  5.  
    paragraph.Alignment = Element.ALIGN_JUSTIFIED;
  6.  
     
  7.  
    jpg.ScaleToFit(250f, 250f);
  8.  
     
  9.  
    jpg.Alignment = Image.TEXTWRAP | Image.ALIGN_RIGHT;
  10.  
     
  11.  
    jpg.IndentationLeft = 9f;
  12.  
     
  13.  
    jpg.SpacingAfter = 9f;
  14.  
     
  15.  
    jpg.BorderWidthTop = 36f;
  16.  
     
  17.  
    jpg.BorderColorTop = Color.WHITE;
  18.  
     
  19.  
    doc.Add(jpg);
  20.  
     
  21.  
    doc.Add(paragraph);

上面例子中,我为图片加上了白色的边框并使其居于文本上方.并给图片左方和下方加上了一些内衬距离使其不会紧贴文本.左边和下边的内衬距离可以通过设置IndentationLeft和IndentationRight属性实现,也可以通过SpacingBefore和SpacingAfter来实现.你或许会疑惑我为什么设置白色边框而不是设置SpacingBefore属性,这是个好问题。实际上,我设置了SpacingBefore属性在这个例子中不知道为什么不起作用。如果谁知道,请告诉我为什么,我很乐意知道。

最后,如果你需要将图片进行旋转,可以通过Rotation属性进行。这个属性是float类型的变量用于表示图片旋转的弧度。如果你在学校数学比我学的好的话,下面的例子使用起来会让你更舒服.如果你数学像我一样烂并且见到下面例子会惊叫出”这是虾米?”的话,你可以读这篇关于度数的文章就能知道Math.PI /2实际上就是90度,或者是设置RotationDegrees属性,这个属性的度数是逆时针的.下面代码中的两种方法实现了相同的效果:

    1.  
      jpg.Rotation = (float)Math.PI / 2;
    2.  
       
    3.  
      jpg.RotationDegrees = 90f;

在Asp.Net中操作PDF – iTextSharp - 操作图片的更多相关文章

  1. 【译】在Asp.Net中操作PDF – iTextSharp - 操作图片

    原文 [译]在Asp.Net中操作PDF – iTextSharp - 操作图片 作为我的iTextSharp系列的文章的第七篇,开始探索使用iTextSharp在PDF中操作图片,理解本篇文章需要看 ...

  2. 【译】在Asp.Net中操作PDF - iTextSharp - 利用列进行排版

    原文 [译]在Asp.Net中操作PDF - iTextSharp - 利用列进行排版 在使用iTextSharp通过ASP.Net生成PDF的系列文章中,前面的文章已经讲述了iTextSharp所涵 ...

  3. 【译】在Asp.Net中操作PDF - iTextSharp - 绘制矢量图

    原文 [译]在Asp.Net中操作PDF - iTextSharp - 绘制矢量图 在上一篇iTextSharp文章中讲述了如何将现有的图片插入PDF中并对其进行操作.但有时,你需要在PDF中绘制不依 ...

  4. 【译】在Asp.Net中操作PDF - iTextSharp - 利用列进行排版(转)

    [译]在Asp.Net中操作PDF - iTextSharp - 利用列进行排版   在使用iTextSharp通过ASP.Net生成PDF的系列文章中,前面的文章已经讲述了iTextSharp所涵盖 ...

  5. 【译】在Asp.Net中操作PDF – iTextSharp - 使用表格

    原文 [译]在Asp.Net中操作PDF – iTextSharp - 使用表格 使用Asp.Net生成PDF最常用的元素应该是表格,表格可以帮助比如订单或者发票类型的文档更加格式化和美观.本篇文章并 ...

  6. 【译】在Asp.Net中操作PDF – iTextSharp - 使用链接和书签

    原文 [译]在Asp.Net中操作PDF – iTextSharp - 使用链接和书签 用户和PDF文档的交互可以通过锚(链接)和书签进行,接着我前面iTextSharp的系列文章,本篇文章主要讲通过 ...

  7. 【译】在Asp.Net中操作PDF – iTextSharp -利用块,短语,段落添加文本

    原文 [译]在Asp.Net中操作PDF – iTextSharp -利用块,短语,段落添加文本 本篇文章是讲述使用iTextSharp这个开源组件的系列文章的第三篇,iTextSharp可以通过As ...

  8. 【译】在Asp.Net中操作PDF - iTextSharp - 使用字体

    原文 [译]在Asp.Net中操作PDF - iTextSharp - 使用字体 紧接着前面我对iTextSharp简介博文,iTextSharp是一个免费的允许Asp.Net对PDF进行操作的第三方 ...

  9. 在Asp.Net中操作PDF – iTextSharp - 使用表格

    使用Asp.Net生成PDF最常用的元素应该是表格,表格可以帮助比如订单或者发票类型的文档更加格式化和美观.本篇文章并不会深入探讨表格,仅仅是提供一个使用iTextSharp生成表格的方法介绍 使用i ...

随机推荐

  1. 6-9 天平 uva839

    这题十分巧妙!!代码精简!强大的递归!!! 边读边判断   先读到底部  慢慢往上判断   难点在于传递w1+w2 有一个比LRJ更加简便的方法  return传递  全局变量判断 #include ...

  2. 【Java】 剑指offer(55-1) 二叉树的深度

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过 ...

  3. 049 CDH商业版本的搭建(hadoop5.3.6 +hive+sqoop)

    为什么使用CDH版本? 这个主要考虑到兼容性. 下载地址:http://archive.cloudera.com/cdh5/cdh/5 最新的CDH公司的hadoop版本: 一:准备工作 1.步骤 1 ...

  4. Tkinter的下拉列表Combobox

    Tkinter的下拉列表Combobox   tk中下拉列表使用ttk.Combobox,代码如下:   #!/usr/bin/env python   # -*- coding: utf-8 -*- ...

  5. Spring框架学习03——Spring Bean 的详解

    1.Bean 的配置 Spring可以看做一个大型工厂,用于生产和管理Spring容器中的Bean,Spring框架支持XML和Properties两种格式的配置文件,在实际开发中常用XML格式的配置 ...

  6. 线程、对称多处理和微内核(OS 笔记三)

    线程.对称多处理 ​ 这一部分继续深入探讨与进程管理相关的高级概念并了解多处理机的对称多处理技术. 进程和线程 到目前为止提出的进程的概念包含两个特点: 资源所有权 存放进程映像的虚拟地址空间 调度/ ...

  7. java代码审计文章集合

    0x00 前言 java代码审计相关文章整理,持续更新. 0x01 java环境基础 搭建Java Web开发环境   配置IDEA编辑器开发java web,从0创建项目   IDEA动态调试   ...

  8. 基于zepto的移动端轻量级日期插件

    前言 做过移动Web开发的同学都知道,移动端日期选择是很常见的需求.在PC端,我们有很丰富的选择,比较出名的就有Mobiscroll和jQuery UI Datepicker.个人看来,这些插件存在的 ...

  9. 利用django信号实现计数功能

    本文主要知识点: 1.使用Django的signals来获取Model的新建/删除操作更新 2.使用数据库的select for update来正确处理并发的数据库操作 3.使用redis的sorte ...

  10. CF 1131 E. String Multiplication

    E. String Multiplication 题意 分析: 从后往前考虑字符串变成什么样子. 设$S_i = p_1 \cdot p_2 \dots p_{i}$,最后一定是$S_{n - 1} ...