本文介绍如何在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. nodeJS创建工程

    转http://blog.csdn.net/i348018533/article/details/47258449 设置镜像地址 1.通过config命令 npm config set registr ...

  2. linux下使用正确的用户名密码,本地无法连接mysql

    问题现象: Linux系统为CentOS 7.0 64位,通过IP远程mysql时,可以正常访问,确定账号密码没有问题.但是本地连接mysql时,提示ERROR 1045 (28000): Acces ...

  3. 用java程序输出自己的姓名

    代码部分: public class Hello { public static void main(String[] args) { System.out.println("$$$$$$$ ...

  4. Error: Could not access the Package Manager. Is the system running?

    最近在搭建cordova,android 开发环境,安装android studio之后创建一个demo之后,运行想看一下效果,在运行过程中创建一个虚拟机(arm)的,等了有1分钟左右,再次运行程序, ...

  5. 利用Keydown事件阻止用户输入

    先了解下各事件的区别 keydown:在控件有焦点的情况下按下键时发生 keypress:在控件有焦点的情况下按下键时发生 keyup:   在控件有焦点的情况下释放键时发生 意义 keypress主 ...

  6. matlab ASCII 格式导入

    matlab ASCII 格式导入 可以用fprintf函数,来代替save函数啊比如现在我有一个变量a=[0.1223 345.4544]如果我想保存它的话,可以用下面的程序:fid = fopen ...

  7. eclipse在Ubuntu 13.04下的安装过程及问题小记

    一.eclipse安装过程 首先确保在安装eclipse之前已经安装好Java虚拟机 1. eclipse官网下载压缩包 下载地址:http://www.eclipse.org/downloads/? ...

  8. Vertica 项目常用代码

    1.查看目录下面有多少文件数 ls -l |grep "^-"|wc -l 思路很明显了,ls后通过grep进行过滤判断是文件还是文件夹, 如果是判断文件夹,可以使用ls -l | ...

  9. [转]10个学习Android开发的网站推荐

    本文转自:http://blog.csdn.net/i_lovefish/article/details/43950893 1. Android Developers 作为一个Android开发者,官 ...

  10. Eclipse安装Database Development插件。

        早期版本的Eclipse,自带Database Development,用着挺方便的,可是自己的最新版Eclipse反而没有.于是乎钻研了下,找到了安装方法.和汉化包安装很类似: 菜单栏里选择 ...