本文介绍如何在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. 【转】Python开发指南:最佳实践精选

    总体原则 价值 “为别人开发你也想要使用的工具.” ——Kenneth Reitz "简洁总是胜过可用." ——Pieter Hintjens "满足90%的使用场景.忽 ...

  2. 传递给后台的Json数据解析

    后台代码如下: public void ProcessRequest(HttpContext context) { context.Response.ContentType = "appli ...

  3. 百度地图简单使用——添加折线,圆形等(html,js)

    地图覆盖物概述 所有叠加或覆盖到地图的内容,我们统称为地图覆盖物.如标注.矢量图形元素(包括:折线和多边形和圆).信息窗口等.覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的移动. 地图A ...

  4. iOS网络编程--NSConnection的同步连接与异步连接

    // // ZFViewController.m // 0628-表单验证 // // Created by zfan on 14-6-28. // Copyright (c) 2014年 zfan. ...

  5. 爆零后的感受外加一道强联通分量HDU 4635的题解

    今天又爆零了,又是又,怎么又是又,爆零爆多了,又也就经常挂嘴边了,看到这句话,你一定很想说一句””,弱菜被骂傻,也很正常啦. 如果你不开心,可以考虑往下看. 翻到E(HDU 4635 Strongly ...

  6. hdu 2196 Computer(树形DP)

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  7. malloc calloc 和 realloc

    realloc()函数 原型:extern void *realloc(void *mem_address, unsigned int newsize); 语法:指针名=(数据类型*)realloc( ...

  8. 怎么在ZBrush中渲染漫画风格的插画

    创建“漫画插画”的外观和感觉想必一定很有趣吧,但是,获得想要的精确外观有时也会令人相当沮丧,因此了解一些基本原则,创建类似于ZBrush漫画MatCaps的作品很有必要. 若有疑问亦或者想查看具体的视 ...

  9. Codeforces Round #370 (Div. 2)B. Memory and Trident

    地址:http://codeforces.com/problemset/problem/712/B 题目: B. Memory and Trident time limit per test 2 se ...

  10. 二分图最大匹配算法-Hopcroft-Karp模板

    时间复杂度:O((√V)*E) #include<stdio.h> #include<string.h> ,M=,INF=0x3f3f3f3f; int dx[N],dy[M] ...