本文介绍如何在C#中使用ItextSharp生成带echarts图表的pdf

一.生成一个简单的pdf

后台代码
     publicActionResultGetPdf()
{
MemoryStream ms =newMemoryStream();
Document document =newDocument();
PdfWriter.GetInstance(document, ms);
document.Open();
document.Add(newParagraph("Yes Master!"));
document.Close();
returnFile(ms.ToArray(),"application/pdf","ceshi.pdf");
}

得到一个pdf

二.使pdf支持中文
后台代码
 public ActionResult GetPdf()
{
it.Font font = new it.Font(BaseFont.CreateFont("C:\\Windows\\Fonts\\simhei.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED), ); MemoryStream ms = new MemoryStream();
it.Document document = new it.Document(); PdfWriter.GetInstance(document, ms); document.Open(); document.Add(new it.Paragraph("Yes Master!"));
document.Add(new it.Paragraph("其疾如风,其徐如林,侵掠如火,不动如山,难知如阴,动如雷震", font)); document.Close();
return File(ms.ToArray(), "application/pdf", "ceshi.pdf");
}

支持中文的pdf

其他的文章中说需要引入两个另外的dll文件
这里面所写的再加入这两句话
    BaseFont.AddToResourceSearch("iTextAsian.dll");
BaseFont.AddToResourceSearch("iTextAsianCmaps.dll");
测试了一下,5.5.5中并不需要再引入,也不需要加入这两句话(加了也没有用,因为会提示你没有AddToResourceSearch这个方法。。。。)
三.在pdf中加入图片
因为给我的需求是要求我将前台的echarts生成的图片在pdf中展示出来,于是可以将这个问题分成几个小问题来做
1.使用echarts生成图片并将其返回给后台
通过google,发现了如下资料:
http://www.oschina.net/question/586955_152417
但是是使用的java,而且其中有一些地方也没有写的很明白。
我这里使用的是C#
前台代码:
 <!DOCTYPE html>

 <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>ImagePdf</title>
<script src="http://cdn.bootcss.com/jquery/1.11.2/jquery.js"></script>
</head>
<body>
<div>
<button id="btnSearch" tabindex="" class="slbutton" style="border-style: none;">
导出</button>
<div id="main" style="height: 400px"></div><input id="maininput" type="hidden"/>
<iframe id="exportContainer" style="display: none;"></iframe>
<script src="http://echarts.baidu.com/build/dist/echarts.js"></script>
<script type="text/javascript">
$(function () {
$("#btnSearch").bind("click", function () {
ExportPDF();
});
});
// 路径配置
require.config({
paths: {
echarts: 'http://echarts.baidu.com/build/dist'
}
}); // 使用
require(
[
'echarts',
'echarts/chart/bar' // 使用柱状图就加载bar模块,按需加载
],
function (ec) {
// 基于准备好的dom,初始化echarts图表
var myChart = ec.init(document.getElementById('main')); var option = {
animation :false,
tooltip: {
show: true
},
legend: {
data: ['销量']
},
xAxis: [
{
type: 'category',
data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
}
],
yAxis: [
{
type: 'value'
}
],
series: [
{
"name": "销量",
"type": "bar",
"data": [, , , , , ]
}
]
}; // 为echarts对象加载数据
myChart.setOption(option);
$("#maininput").val(myChart.getDataURL('jpg'));
}
);
function ExportPDF() { var imgurl = $("#maininput").val();
$.ajax({
async: true,
type: "POST",
url: "/PdfDemo/SendImagePdfUrl",
cache: false,
timeout: * * ,
dataType: "json",
data: {
ImageUrl: imgurl },
success: function (result) {
if (result != null && result.message == "success") {
var src = "/PdfDemo/GetImagePdf?ID=" + result.filename;
$("#exportContainer").attr("src", src);
}
else {
if (result != null) {
alert(result.Message);
}
}
},
beforeSend: function () {
$("#btnSearch").prop("disabled",true);
},
complete: function () {
$("#btnSearch").prop("disabled", false);
}
});
}
</script>
</div>
</body>
</html>

前台代码

前台这里使用的echarts就不用介绍了吧,我将得到的base64的字符串保存到了页面的一个hidden里面(因为不知道如何在ExportPDF中调用echarts的函数得到这个字符串)。另外echarts还提供了getimage的方法,可以直接得到image图像,而这个getDataURL是在IE8下无法使用的(我用的是火狐)。另外这里有一点需要注意:那就是要将echarts的animation 设置为false,这样生成的图像才会有对应的柱形,否则只有坐标轴
2.将得到的base64字符串转化为Image
后台方法
SendImagePdfUrl控制器:
用来得到base64字符串并将其保存为jpg文件
        public ActionResult SendImagePdfUrl(string ImageUrl)
{
JsonResult j = new JsonResult();
string fileName = System.Guid.NewGuid().ToString();
if (!string.IsNullOrEmpty(ImageUrl))
{
Image pdfImage = base64ToPic(ImageUrl);
pdfImage.Save(Server.MapPath("~") + "/pdfimage/" + fileName + "1.jpg");
var data = new { message = "success", filename = fileName };
j.Data = data;//返回单个对象;
}
else
{
var data = new { message = "未提供Url" };
j.Data = data;//返回单个对象;
}
return j;
}
base64ToPic方法:
/// <summary>
/// //对字节数组字符串进行Base64解码并生成图片
/// </summary>
/// <param name="ImageUrl"></param>
/// <returns></returns>
public Image base64ToPic(string ImageUrl)
{ if (ImageUrl == null) //图像数据为空
{
return null;
}
try
{
//将一开始的data:png等信息去掉,只剩base64字符串
String[] url = ImageUrl.Split(',');
String u = url[];
//Base64解码
byte[] imageBytes = Convert.FromBase64String(u);
Image image;
//生成图片
using (MemoryStream ms = new MemoryStream(imageBytes, , imageBytes.Length))
{
// Convert byte[] to Image
ms.Write(imageBytes, , imageBytes.Length);
image = Image.FromStream(ms, true);
}
return image;
}
catch (Exception e)
{
return null;
}
}

Base64ToPic

在后台将收到的请求对应的图片放入pdf并输出
public ActionResult GetImagePdf(string ID)
{
it.Font font = new it.Font(BaseFont.CreateFont("C:\\Windows\\Fonts\\simhei.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED), );
MemoryStream ms = new MemoryStream();
it.Document document = new it.Document();
PdfWriter.GetInstance(document, ms);
document.Open();
document.Add(new it.Paragraph("Yes Master!"));
document.Add(new it.Paragraph("其疾如风,其徐如林,侵掠如火,不动如山,难知如阴,动如雷震", font));
List<string> imageStringList = GetImageString(ID, ); foreach (var item in imageStringList)
{
try
{
//如果传过来的是Base64
//it.Image image = it.Image.GetInstance(base64ToPic(item), System.Drawing.Imaging.ImageFormat.Jpeg);
//如果传过来的是地址
it.Image image = it.Image.GetInstance(Server.MapPath("~") + "/pdfimage/" + item + ".jpg"); image.Alignment = it.Image.ALIGN_LEFT;
image.ScalePercent();
document.Add(image);
}
catch (Exception e)
{
document.Add(new it.Paragraph("图片" + item + "不存在"));
}
}
document.Close();
document.Dispose();
return File(ms.ToArray(), "application/pdf", "ceshi.pdf");
}

将图片放入pdf

其他用到的方法:
        /// <summary>
/// 得到这一系列Image的Url
/// </summary>
/// <param name="ID">相同部分</param>
/// <param name="count">共有几张</param>
/// <returns></returns>
public List<string> GetImageString(string ID, int count)
{
List<string> ImageStringList = new List<string>(); for (int i = ; i < count; i++)
{
ImageStringList.Add(ID + count.ToString());
}
return ImageStringList;
}

其他代码

至此,结束。

欢迎拍砖。

Itextsharp下根据Echarts图像生成pdf的更多相关文章

  1. 昇腾CANN论文上榜CVPR,全景图像生成算法交互性再增强!

    摘要:近日,CVPR 2022放榜,基于CANN的AI论文<Interactive Image Synthesis with Panoptic Layout Generation>强势上榜 ...

  2. itextsharp生成pdf后的直接打印问题

    原文 itextsharp生成pdf后的直接打印问题 小弟这两天用itextsharp生成pdf文档,生成的pdf可以直接保存在指定路径的文件夹下,可是user不想保存,想要点一下button,就可以 ...

  3. itextsharp利用模板生成pdf文件笔记

    iTextSharp是一款开源的PDF操作类库,使用它可以快速的创建PDF文件. 中文参考网站:http://hardrock.cnblogs.com/ http://pdfhome.hope.com ...

  4. C# html生成PDF遇到的问题,从iTextSharp到wkhtmltopdf

    我们的网站业务会生成一个报告,用网页展示出来,要有生成pdf并下载的功能,关键是生成pdf. 用内容一段段去拼pdf,想想就很崩溃,所以就去网上找直接把html生成pdf的方法. 网上资料大部分都是用 ...

  5. iTextSharp生成pdf的一个简单例子

    效果图: 参考:http://www.cnblogs.com/CareySon/archive/2011/11/09/2243496.html http://www.cnblogs.com/julyl ...

  6. linux下编译bib、tex生成pdf文件

    实验: 在linux环境下,编译(英文)*.bib和*.tex文件,生成pdf文件. 环境: fedora 20(uname -a : Linux localhost.localdomain 3.19 ...

  7. ITextSharp用来生成 PDF 的一个组件

    iTextSharp 是用来生成  PDF 的一个组件,在 1998 年夏天的时候,Bruno Lowagie ,iText 的创作者,参与了学校的一个项目,当时使用 HTML 来生成报告,但是,使用 ...

  8. C#使用itextsharp生成PDF文件

    项目需求需要生成一个PDF文档,使用的是VS2010,ASP.NET. 网络上多次搜索没有自己想要的,于是硬着头皮到itextpdf官网看英文文档,按时完成任务,以实用为主,共享一下: 使用HTML文 ...

  9. 使用 ItextSharp HTML生成Pdf(C#)

    以前生成pdf的时候.因为生成的pdf数据是固定的,所以先做好pdf模板,动态的数据可以先用占位符 生成的时候.找到占位符坐标.把数据填充进去 优点:先做好模板.生成的pdf 表格.文.内容会好看一些 ...

随机推荐

  1. Memcache笔记03-php操作Memcached

    通过php程序操作Memcached服务几种形式 Memcache 扩展 Memcached 扩展 Socket套接字操作 memcached-client.php(函数) 对于php扩展来说,dan ...

  2. 问题解决——VS2010 将生成的文件复制到指定位置

    我是从VC6直接过渡到VS2010的,VS2008没怎么用过.用VS2010的时候,每次生成dll后,手工把dll.lib..h文件复制到指定文件夹太麻烦了,所以着手写了这个. =========== ...

  3. Spring-framework下载

    下载版本,修改版本号就行. http://repo.springsource.org/libs-release-local/org/springframework/spring/4.3.2.RELEA ...

  4. db2 常用命令(一)

    DB2数据库常用命令小结   ========操作数据库命令==========   -- 启动数据库实例 #db2start    -- 停止数据库实例    #db2sto         # 如 ...

  5. c++字符串互相转换

    1.string vs char* //string to char* string str; const char* cch = str.c_str(); ]; strcpy(ch,cch); // ...

  6. 最小生成树 2429: [HAOI2006]聪明的猴子

    BZOJ 2429: [HAOI2006]聪明的猴子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 877  Solved: 566[Submit][ ...

  7. 怎样用ZBrush中复数对象进行工作

    在ZBrush®中有两种方法可以使用复数对象即“多边形组”和“次工具”. 若有疑问可直接访问:http://www.zbrushcn.com/jichu/fushu-duixiang.html 什么是 ...

  8. mac os下得pycharm怎么设置mercurial?

    捣鼓了一会儿,最终搞定了. 先把链接贴上来:https://www.jetbrains.com/pycharm/help/mercurial.html 如果你发现你的pycharm在设置mercuri ...

  9. FZU 2148 Moon Game --判凹包

    题意:给一些点,问这些点能够构成多少个凸四边形 做法: 1.直接判凸包 2.逆向思维,判凹包,不是凹包就是凸包了 怎样的四边形才是凹四边形呢?凹四边形总有一点在三个顶点的内部,假如顶点为A,B,C,D ...

  10. 安全框架 - Shiro与springMVC整合的注解以及JSP标签

    Shiro想必大家都知道了,之前的文章我也有提过,是目前使用率要比spring security都要多的一个权限框架,本身spring自己都在用shiro,之前的文章有兴趣可以去扒一下 最近正好用到s ...