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

    作为我的iTextSharp系列的文章的第七篇,开始探索使用iTextSharp在PDF中操作图片,理解本篇文章需要看过系列文章的前六篇:

    在ASP.NET中创建PDF-iTextSharp起步

    在Asp.Net中操作PDF - iTextSharp - 使用字体

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

    在Asp.Net中操作PDF – iTextSharp-列表
    在Asp.Net中操作PDF – iTextSharp - 使用链接和书签

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

 

    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();
 
}
 
 

 

 

    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);
 
}

 

   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);

 

    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);

 

    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));

 

 

   上面代码中,我还为嵌入的图片加上了一个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);

 

    5

   

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

 

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

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

------------------------------

原文链接:    iTextSharp - Working with images

Translated by CareySon

使用iTextSharp处理PDF c)通过解析器的模板方法ProcessContent指定页码和相应 的读取方法生成读取策略(下图中的i为页码,第二个参数为读取方法类,前面尖括号内为该模板方法的类型指定,对于文本读取应为如下图所示的类型);2、使用Document对象和文件流(指定文件流模式和分割后的文件存储的路径)生成PdfCopy类的对象(该对象将Document对象与输出文件流关联);6、将提取出的PdfImportPage类对象(一页PDF)通过PdfCopy对象的AddPage方法添加至相关联原Document中; 阅读详情

相关推荐

ArcGIS插值可视化气象数据

前言 地图底图的制作和气象数据的预处理见我上两篇博客 ArcGIS精美中国地图制作(详解) python处理日值气象数据 在前面我们已经将日值的地温数据处理成了年均地温,添加了站点经纬度坐标并导出为excel格式。 得到如下数据: 导入数据 在Arcmap中 文件-添加XY数据 将年均地温和站点位置数据导入。 注意:excel表格的格式要另存为97-2003工作簿形式,否则会有"arcgi...

江北20190411的博客 2万+

图片(六)

Image对象 如果你学习过API,你可能已经注意到可以通过几种构造函数来创建图片,本手册中,我们将仅仅告诉你最简单的解决方案,如访问通过文件名或URL确定的图片生成的Image对象。 public static Image getInstance(Uri url) public static Image getInstance(string filename) Image是一个抽象类...

weixin_30436891的博客 387

IText学习手册——图片设置

IText学习手册——图片设置 一、图片位置: 设置图片对象的Alignment属性,可以取得值有:iTextSharp.text.Image.RIGHT_ALIGN(居右)、iTextSharp.text.Image.LEFT_ALIGN(居左)、iTextSharp.text.Image.ALIGN_CENTER(居中) 二、图片大小 有3种方式: 1.ScaleToFit方法,他的...

qq_30725967的博客 5260

iText使用教程(4)

<br />Image对象<br /><br />如果你学习过API,你可能已经注意到可以通过几种构造函数来创建图片,本手册中,我们将仅仅告诉你最简单的解决方案,如访问通过文件名或URL确定的图片生成的Image对象。public static Image getInstance(Uri url) public static Image getInstance(string filename)<br /><br />Image是一个抽象类,故得到实例的方法将判断给出的图片的类别(GIF、Jpeg、PNG…

记忆的碎片 1469

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

在使用iTextSharp通过ASP.Net生成PDF的系列文章中,前面的文章已经讲述了iTextSharp所涵盖的大多数基本功能.本文主要讲述通过另外一种方法来对文档进行排版,那就是使用列(columns).本系列之前的文章如下: 在ASP.NET中创建PDF-iTextSharp起步 在Asp.Net操作PDF - iTextSharp - 使用字体 在Asp.Net操作PDF

prefercent的专栏 734

使用iTextSharpAsp.Net操作PDF系列文章 目录

iTextSharp是一个从JAVA项目iText衍生的.Net版本的开源项目。这个项目在操作PDF方面功能相当强大..Net版本的iTextSharp资料和文档相对比较少,网上已有的资料相对零散.最近在项目中需要生成PDF,在查阅相关资料中找到一个讲述iTextSharp的系列文章,讲的比较系统。就在这几天业余时间翻了一下,翻的过程同时也是学习的过程. 目录如下: 在ASP.NET

prefercent的专栏 606

Asp.Net操作PDFiTextSharp - 操作图片

转自:http://www.cnblogs.com/CareySon/archive/2011/11/07/2239017.html iTextSharp支持所有主流的图片格式,比如:jpg, tif, gif, bmp, png和wmf.iTextSharp中使用Image.GetInstance()方法创建图片有很多种方式,或许最常用的方式应该是传入文件的路径和文件名到该方法中:

我本无名的专栏 9947

使用iTextSharpAsp.Net操作PDF系列文章 目录

原文地址:http://www.cnblogs.com/CareySon/archive/2011/11/09/2243496.html 使用iTextSharpAsp.Net操作PDF系列文章 目录     iTextSharp是一个从JAVA项目iText衍生的.Net版本的开源项目。这个项目在操作PDF方面功能相当强大..Net版本的iTextSharp资料和文档相

潘晓宇(panxiaoyu)的专栏 2227

itext 图片问题

1.概述        图片可以是WMF、Gif、Jpeg和PNG。 使用4个URL得到:        Image wmf = Image.getInstance(new URL("../examples/harbour.wmf"));        Image gif = Image.getInstance(new URL("../examples/vonnegut.gif"));

topjavadeveloper的专栏 2365

Image.getScaledInstance

public image getscaledinstance(intwidth, intheight, inthints) 创建此图像的缩放版本。返回一个新的image对象,默认情况下,该对象按指定的width和height呈现图像。即使已经完全加载了初...

yc15128221056的博客 1794

java 使用itext 导出pdf 控制图片的大小

在使用itext 导出pdf 的过程中,可能会遇到这样的需求,就是导出文字加图片。使用我们前面写的程序,确实是可以导出图片,如果针对于类似简历的需求,图片填充单元格,会满足效果,如下图所示: 但在实际的很多需求中,可能需要的是小图标,此时我们就需要去控制图片的大小了。 使用com.lowagie.text.Image 控制图片大小的几种方式: //5、创建图片对象,加入headerTable中...

洋葱花瓣的专栏 1万+

Image图片压缩

> 第一个页面 主方法中实现public class MainActivity extends AppCompatActivity { private ImageView ivIcon; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInsta

Monster_czy的博客 592

ImageLoader相关笔记

两种方式加载图片: loadImage displayImage ImageLoader.getInstance().loadImage(imageUrl, mImageSize, options, new SimpleImageLoadingListener(){ @Override public void onLoadingComplete

Small_Lee的博客 713

ImageLoader的使用

使用ImageLoader的方式: 1 下载lib:https://github.com/nostra13/Android-Universal-Image-Loader解压后找到universal-image-loader-1.9.5.jar导入工程 2 写入权限: 3 可导入ImageLoaderUtils进行相关参数配置 :http://download.c

小磊's blog 6093

YOLO26魔改神技:YOLO26引入SimAM(无参注意力):不增加网络参数的3D能量函数提点黑科技

文章摘要 2026年YOLO26模型发布引发边缘计算革命,但特定场景精度不足问题催生注意力机制改进需求。本文聚焦无参数注意力机制SimAM,基于神经科学理论通过3D能量函数直接计算神经元权重,实现零参数量提升模型性能。文章深度解析YOLO26四大创新架构,对比SimAM与传统注意力机制差异,并探讨其在YOLO26中的集成方案。研究显示,SimAM在不增加模型体积前提下显著提升mAP指标,特别适合边缘端部署。全文涵盖架构设计、代码实现、竞品对比、部署方案等维度,为轻量化视觉模型优化提供系统解决方案。

ZDQ58818的博客 249

最新matlab+yalmip+cplex综合能源及微电网优化运行研究

区域综合能源系统中储能设备参与辅助服务的运行优化最新的matlab+yalmip+cplex综合能源及微电网优化运行研究相关论文,供研究学习参考。

上一篇: Android中文API(136) —— GeoCoder
下一篇: SCOM 2007 R2详解系列之安装部署准备篇-下
weixin_34248118
博客等级 码龄10年 1万+粉丝 169原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值