根据pdf模板文件添加数据生成新的pdf与pdf添加读取二维码
参考文档 :https://www.cnblogs.com/ibeisha/p/itextsharp-pdf.html
程序demo 地址:https://github.com/hudean/itextsharpDemo
我这边收到一份word版的文档,首先,我们将其另存为PDF文件。其次,在https://www.pdfescape.com/open/这个网站,将PDF文件上传上去,进行在线编辑。

也可以通过PDF软件工具,进行编辑。这里,我把需要填写部分的内容,全画上表单元素,设置元素的name,后面根据name 属性对其进行赋值。具体操作,将text放置指定处,然后鼠标右键,看到如下界面:

这里Name属性就是后面我们要用到的。目前它支持的元素有:

1、使用itextsharp 生成pdf文件 引用itextsharp 包
DataTable 转成pdf文件
private static void Method()
{
DataTable dt = new DataTable();
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("name", typeof(string));
dt.Columns.Add("age", typeof(int));
dt.Columns.Add("address", typeof(string));
dt.Clear();
DataRow dr = dt.NewRow();
dr["id"] = 1; dr["name"] = "cscc"; dr["age"] = 26; dr["address"] = "江西省";
dt.Rows.Add(dr);
dt.AcceptChanges();
bool b = ITextSharpHelper2.ConvertDataTableToPDF(dt, @"C:\Users\Administrator\Desktop\testPDF.pdf", "C://WINDOWS//FONTS//SIMSUN.TTC,1", 9);
Console.WriteLine($"{b}");
Console.ReadKey();
}
ITextSharpHelper2帮助类

public class ITextSharpHelper2
{
/// <summary>
/// 根据pdf模板写入数据生成新的pdf
/// </summary>
/// <param name="saveFile">保存的新pdf路径</param>
/// <param name="sourceFile">原pdf路径</param>
public static void AddNewPdf(string saveFile, string sourceFile)
{
//写入新的pdf地址
//sourceFile = @"C:\Users\Administrator\Desktop\ABC\temp.pdf";
//sourceFile = @"C:\Users\Administrator\Desktop\temp123.pdf";
iTextSharp.text.pdf.PdfDocument document = new iTextSharp.text.pdf.PdfDocument();
//读取的源pdf文件
iTextSharp.text.pdf.PdfReader pdfReader = new iTextSharp.text.pdf.PdfReader(sourceFile);
PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(saveFile, FileMode.OpenOrCreate));
AcroFields pdfFormFields = pdfStamper.AcroFields;
pdfStamper.FormFlattening = true;
//BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
//BaseFont simheiBase = BaseFont.CreateFont(@"C:\Windows\Fonts\simhei.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
BaseFont simheiBase = BaseFont.CreateFont(@"C:\Windows\Fonts\simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
pdfFormFields.AddSubstitutionFont(simheiBase);
Dictionary<string, string> para = new Dictionary<string, string>();
para.Add($"Numbering", "12369999995");
for (int i = 1; i < 38; i++)
{
para.Add($"Numbering{i}", "12365");
}
foreach (KeyValuePair<string, string> parameter in para)
{
pdfStamper.AcroFields.SetField(parameter.Key, parameter.Value);
}
//pdfStamper.AcroFields.SetField("Names", "李朝强");
//pdfStamper.AcroFields.SetField("chk", "yes", true);
pdfStamper.Close();
pdfReader.Close();
} /// <summary>
/// pdf文件添加图片
/// </summary>
/// <param name="oldPath">源PDF文件</param>
/// <param name="newPath">新PDF文件</param>
/// <param name="imPath">图片地址</param>
/// <param name="x"></param>
/// <param name="y"></param>
public static void AddImg(string oldPath, string newPath, string imPath, float x, float y)
{
iTextSharp.text.pdf.PdfDocument doc = new iTextSharp.text.pdf.PdfDocument(); iTextSharp.text.pdf.PdfReader pdfReader = new iTextSharp.text.pdf.PdfReader(oldPath);
PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(newPath, FileMode.OpenOrCreate));
//获取PDF指定页面内容
var pdfContentByte = pdfStamper.GetOverContent(1);
//添加图片
Image image = Image.GetInstance(imPath); //设置图片大小
image.ScaleToFit(100, 100);
//设置图片位置
image.SetAbsolutePosition(x, y);
pdfContentByte.AddImage(image);
pdfStamper.FormFlattening = true;
pdfStamper.Close();
pdfReader.Close(); } /// <summary>
/// DataTable 转成Pdf文件
/// </summary>
/// <param name="Data"></param>
/// <param name="PDFFile"></param>
/// <param name="FontPath"></param>
/// <param name="FontSize"></param>
/// <returns></returns>
public static bool ConvertDataTableToPDF(DataTable Data, string PDFFile, string FontPath, float FontSize)
{
Document document = new Document();
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(PDFFile, FileMode.Create));
document.Open();
BaseFont baseFont =
BaseFont.CreateFont(
FontPath,
BaseFont.IDENTITY_H,
BaseFont.NOT_EMBEDDED);
iTextSharp.text.Font font = new iTextSharp.text.Font(baseFont, FontSize);
PdfPTable table = new PdfPTable(Data.Columns.Count);
for (int i = 0; i < Data.Rows.Count; i++)
{
for (int j = 0; j < Data.Columns.Count; j++)
{
table.AddCell(new Phrase(Data.Rows[i][j].ToString(), font));
}
}
document.Add(table);
document.Close();
writer.Close();
return true;
} }
调用
static void Main(string[] args)
{
#region DataTable 转成pdf文件 // Method();
#endregion #region 向pdf文件添加图片 //ITextSharpHelper2.AddImg(@"C:\Users\Administrator\Desktop\testPDF.pdf", @"C:\Users\Administrator\Desktop\tempPDF.pdf", @"C:\Users\Administrator\Desktop\QRCode.png", 300, 100); #endregion #region 向pdf模板文件添加数据 ITextSharpHelper2.AddNewPdf(@"C:\Users\Administrator\Desktop\temp3.pdf", @"C:\Users\Administrator\Desktop\temp123.pdf");
#endregion Console.ReadKey();
}
(模板文件在程序的文件夹里,模板里要填的数据我在上面所有的属性都填写对应的名称)
Zxing 生成读取二维码帮助类,引用ZXing 包

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ZXing;
using ZXing.Common;
using ZXing.QrCode; namespace QRCode
{
public class ZxingHelper
{
/// <summary>
/// 生成二维码,保存成图片
/// </summary>
public static void Generate1(string text, string filename)
{
BarcodeWriter writer = new BarcodeWriter();
writer.Format = BarcodeFormat.QR_CODE;
QrCodeEncodingOptions options = new QrCodeEncodingOptions();
options.DisableECI = true;
//设置内容编码
options.CharacterSet = "UTF-8";
//设置二维码的宽度和高度
options.Width = 500;
options.Height = 500;
//设置二维码的边距,单位不是固定像素
options.Margin = 1;
writer.Options = options; Bitmap map = writer.Write(text);
//string filename = @"H:\桌面\截图\generate1.png";
map.Save(filename, ImageFormat.Png);
map.Dispose();
} /// <summary>
/// 生成条形码
/// </summary>
/// <param name="text"></param>
public static void Generate2(string text, string filename)
{
BarcodeWriter writer = new BarcodeWriter();
//使用ITF 格式,不能被现在常用的支付宝、微信扫出来
//如果想生成可识别的可以使用 CODE_128 格式
//writer.Format = BarcodeFormat.ITF;
writer.Format = BarcodeFormat.CODE_128;
EncodingOptions options = new EncodingOptions()
{
Width = 150,
Height = 50,
Margin = 2
};
writer.Options = options;
Bitmap map = writer.Write(text);
//string filename = @"H:\桌面\截图\generate2.png";
map.Save(filename, ImageFormat.Png);
} /// <summary>
/// 读取二维码
/// 读取失败,返回空字符串
/// </summary>
/// <param name="filename">指定二维码图片位置</param>
public static string Read1(string filename)
{
BarcodeReader reader = new BarcodeReader();
reader.Options.CharacterSet = "UTF-8";
Bitmap map = new Bitmap(filename);
Result result = reader.Decode(map);
return result == null ? "" : result.Text;
}
}
}
ThoughtWorks 生成读取二维码帮助类,引用ThoughtWorks 包

using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ThoughtWorks.QRCode.Codec; namespace QRCode
{
public class ThoughtWorksHelper
{ /// <summary>
/// ThoughtWorks.QRCode生成二维码
/// </summary>
/// <param name="idStr">写入二维码的字符串</param>
/// <param name="strSaveDir">保存的路径</param>
/// <param name="fileName">保存文件名称例如 QRCode.png</param>
/// <returns></returns>
public static void QRCodeMehed(string idStr,string strSaveDir,string fileName)
{
QRCodeEncoder endocder = new QRCodeEncoder();
//二维码背景颜色
endocder.QRCodeBackgroundColor = System.Drawing.Color.White;
//二维码编码方式
endocder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
//每个小方格的宽度
endocder.QRCodeScale = 10;
//二维码版本号
endocder.QRCodeVersion = 5;
//纠错等级
endocder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
//var person = new { Id = 1, Name = "wolfy", Gender = 1, Age = 24 };
//string idStr = "134165897456321";
//将json川做成二维码
//Bitmap bitmap = endocder.Encode(new JavaScriptSerializer().Serialize(person), System.Text.Encoding.UTF8);
Bitmap bitmap = endocder.Encode(idStr, System.Text.Encoding.UTF8);
//string strSaveDir = @"C:\Users\Administrator\Desktop\ABC";//Request.MapPath("/QRcode/");
if (!Directory.Exists(strSaveDir))
{
Directory.CreateDirectory(strSaveDir);
}
// string strSavePath = Path.Combine(strSaveDir, "QRCode" + ".png");
string strSavePath = Path.Combine(strSaveDir, fileName);
//System.IO.FileStream fs = new System.IO.FileStream(strSavePath, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write);
//bitmap.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg);
if (!System.IO.File.Exists(strSavePath))
{
bitmap.Save(strSavePath);
}
} /// <summary>
/// ThoughtWorks.QRCode解析二维码
/// </summary>
/// <returns></returns>
public static string DeCoder(string strSaveDir, string fileName)
{
string result = "";
//string strSaveDir = @"C:\Users\Administrator\Desktop\ABC";//Request.MapPath("/QRcode/");
fileName = "QRCode.png";
if (!Directory.Exists(strSaveDir))
{
Directory.CreateDirectory(strSaveDir);
}
string strSavePath = Path.Combine(strSaveDir, fileName );
if (System.IO.File.Exists(strSavePath))
{
QRCodeDecoder decoder = new QRCodeDecoder();
result = decoder.decode(new ThoughtWorks.QRCode.Codec.Data.QRCodeBitmapImage(new Bitmap(Image.FromFile(strSavePath))));
} return result;
}
}
}
Spire 读取pfd文件和插入图片和读取pdf里的图片 引用Spire包

using Spire.Pdf;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ZXing; namespace QRCode
{
public class SpireHelper
{
//文档地址 https://www.e-iceblue.cn/spirepdfnet/spire-pdf-for-net-program-guide-content.html /// <summary>
/// Spire插件添加二维码到PDF
/// </summary>
/// <param name="sourcePdf">pdf文件路径</param>
/// <param name="sourceImg">二维码图片路径</param>
public static void AddQrCodeToPdf(string sourcePdf, string sourceImg)
{
//初始化PdfDocument实例,导入PDF文件
Spire.Pdf.PdfDocument doc = new Spire.Pdf.PdfDocument(); //加载现有文档
doc.LoadFromFile(sourcePdf);
//添加一个空白页,目的为了删除jar包添加的水印,后面再移除这一页 (没有用)
//PdfPageBase pb = doc.Pages.Add();
//获取第二页
//PdfPageBase page = doc.Pages[1];
//获取第1页
PdfPageBase page = doc.Pages[0];
//加载图片到Image对象
Image image = Image.FromFile(sourceImg); //调整图片大小
int width = image.Width;
int height = image.Height;
float scale = 0.18f; //缩放比例0.18f;
Size size = new Size((int)(width * scale), (int)(height * scale));
Bitmap scaledImage = new Bitmap(image, size); //加载缩放后的图片到PdfImage对象
Spire.Pdf.Graphics.PdfImage pdfImage = Spire.Pdf.Graphics.PdfImage.FromImage(scaledImage); //设置图片位置
float x = 516f;
float y = 8f; //在指定位置绘入图片
//page.Canvas.DrawImage(pdfImage, x, y);
page.Canvas.DrawImage(pdfImage, new PointF(x,y),size);
//移除第一个页
//doc.Pages.Remove(pb); //去除第一页水印
//保存文档
doc.SaveToFile(@sourcePdf);
doc.Close();
//释放图片资源
image.Dispose();
} /// <summary>
/// Spire插件读取PDF中的二维码并保存二维码图片
/// </summary>
/// <param name="file">pdf文件路径</param>
public static void QrCodeToPdf(string file,string fileImg)
{
//加载PDF文档
PdfDocument doc = new PdfDocument();
doc.LoadFromFile(file); List<Image> listImages = new List<Image>(); for (int i = 0; i < doc.Pages.Count; i++)
{
// 实例化一个Spire.Pdf.PdfPageBase对象
PdfPageBase page = doc.Pages[i]; // 获取所有pages里面的图片
Image[] images = page.ExtractImages(true); //page.ExtractImages();
if (images != null && images.Length > 0)
{
listImages.AddRange(images);
} } // 将提取到的图片保存到本地路径
if (listImages.Count > 0)
{
for (int i = 0; i < listImages.Count; i++)
{
Image image = listImages[i];
//image.Save(@"C:\Users\Administrator\Desktop\ABC\image" + (i + 3).ToString() + ".png", System.Drawing.Imaging.ImageFormat.Png);
image.Save(fileImg, System.Drawing.Imaging.ImageFormat.Png);
} }
} /// <summary>
/// Spire插件读取PDF中的二维码,Zxing识别二维码
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
public static string QrCodeToPdftwo(string file)
{
string str = "";
//加载PDF文档
PdfDocument doc = new PdfDocument();
doc.LoadFromFile(file); List<Image> listImages = new List<Image>(); for (int i = 0; i < doc.Pages.Count; i++)
{
// 实例化一个Spire.Pdf.PdfPageBase对象
PdfPageBase page = doc.Pages[i]; // 获取所有pages里面的图片
Image[] images = page.ExtractImages();
if (images != null && images.Length > 0)
{
listImages.AddRange(images);
} } if (listImages.Count > 0)
{ //QRCodeDecoder decoder = new QRCodeDecoder();
//var image = listImages[0];
//str = decoder.decode(new ThoughtWorks.QRCode.Codec.Data.QRCodeBitmapImage((Bitmap)image)); var image = listImages[0];
ZXing.BarcodeReader reader = new ZXing.BarcodeReader();
reader.Options.CharacterSet = "UTF-8";
Bitmap map = new Bitmap(image);
Result result = reader.Decode(map);
return result == null ? "" : result.Text;
} return str;
}
}
}
调用

using Spire.Pdf;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ThoughtWorks.QRCode.Codec;
using ZXing;
using ZXing.Presentation; namespace QRCode
{
class Program
{
static void Main(string[] args)
{ #region 使用ThoughtWorks 生成识别二维码 ////生成二维码
//ThoughtWorksHelper.QRCodeMehed("123598788", @"C:\Users\Administrator\Desktop\", "QRCode.png"); ////解析二维码
//string str = ThoughtWorksHelper.DeCoder(@"C:\Users\Administrator\Desktop\", "QRCode.png");
//Console.WriteLine(str);
//Console.ReadKey();
#endregion #region 使用Zxing 生成识别二维码
//生成二维码
//ZxingHelper.Generate1("8585855885",@"C:\Users\Administrator\Desktop\QRCode1.png"); ////解析二维码
//string str = ZxingHelper.Read1(@"C:\Users\Administrator\Desktop\QRCode1.png");
//Console.WriteLine(str);
//Console.ReadKey();
#endregion #region 使用Spire 向pdf添加二维码或读取pdf文件里的二维码 //文档地址 https://www.e-iceblue.cn/spirepdfnet/spire-pdf-for-net-program-guide-content.html //向pdf添加二维码
//SpireHelper.AddQrCodeToPdf(@"C:\Users\Administrator\Desktop\testPDF.pdf", @"C:\Users\Administrator\Desktop\QRCode1.png");
//在pdf读取二维码,并保存二维码图片
//SpireHelper.QrCodeToPdf(@"C:\Users\Administrator\Desktop\testPDF.pdf", @"C:\Users\Administrator\Desktop\QRCode2.png");
//在pdf读取二维码
string str = SpireHelper.QrCodeToPdftwo(@"C:\Users\Administrator\Desktop\testPDF.pdf");
Console.WriteLine(str);
Console.ReadKey();
#endregion
}
}
}
根据pdf模板文件添加数据生成新的pdf与pdf添加读取二维码的更多相关文章
- ZXing 生成、读取二维码(带logo)
前言 ZXing,一个支持在图像中解码和生成条形码(如二维码.PDF 417.EAN.UPC.Aztec.Data Matrix.Codabar)的库.ZXing(“zebra crossing”)是 ...
- Swift3.0生成二维码、扫描二维码、相册读取二维码,兼容iOS7(结合ZXingObjC)
二维码生成 //MARK: 传进去字符串,生成二维码图片(>=iOS7) text:要生成的二维码内容 WH:二维码高宽 private func creatQRCodeImage(text: ...
- 【java】google的zxing架包生成二维码和读取二维码【可带文字和logo】
承接RC4生成不重复字符串的需求之后,因为优惠码要方便用户使用的缘故,所以思来想去,觉得还是直接生成二维码给用户直接扫比较实用,也不用用户专门记录冗长的优惠码编号. ================= ...
- ZXing生成二维码、读取二维码
使用谷歌的开源包ZXing maven引入如下两个包即可 <dependency> <groupId>com.google.zxing</groupId> & ...
- jquery-qrcode 生成和读取二维码
首先要导入jar包(生成二维码的jar和读取二维码的jar) 生成二维码: package com.imooc.qrcode; import java.awt.Color; import java.a ...
- zxing生成二维码和读取二维码
当然,首先要导入zxing的jar包. 生成二维码代码: package com.imooc.zxing; import java.io.File; import java.nio.file.Path ...
- Itext读取PDF模板文件渲染数据后创建新文件
Maven导入依赖 <properties> <itextpdf.version>5.5.0</itextpdf.version> <itext-asian. ...
- C# 利用BarcodeLib.dll生成条形码(一维,zxing,QrCodeNet/dll二维码)
原文:http://blog.csdn.net/kongwei521/article/details/17588825 首先效果: 一.下载BarcodeLib.dll 下载地址 :http://do ...
- 又是新动作!微信小程序专属二维码出炉
又到了晚上,微信又给我们带来了惊喜,并这次不是新的能力,而是把大家再熟悉不过的二维码换了新的造型. 正式揭晓:微信特制的小程序码.扫一扫新二维码 只要你的微信升级到了 6.5.7 版本,就可以扫码或者 ...
- golang中生成读取二维码(skip2/go-qrcode和boombuler/barcode,tuotoo/qrcode)
1 引言 在github上有好用golan二维码生成和读取库,两个生成二维码的qrcode库和一个读取qrcode库. skip2/go-qrcode生成二维码,github地址:https://g ...
随机推荐
- API 设计最佳实践(简版)
Restful API 本文简称API,是一个种面向资源的架构.在Restful中一个API对应一个资源,资源可以是文本,图片,视频等.API特征有如下: 每一个URI代表一种资源 客户端和服务器之间 ...
- 这两种完全不同的JPEG加载方式,你肯定见过!
现如今网站所使用的的图片格式多种多样,但是有一种图片格式占到了 74% 的使用量.它就是 JPEG,即联合图像专家组.这类文件的后缀通常为 .jpg 或 .jpeg,是摄影中常见的图片类型. JPEG ...
- 《consul 简易上手指南》
consul 是一个用来做服务发现的框架,具有分布式.高可用以及可横向扩展的特性 什么是服务发现?为什么要实现服务发现? 举个常见的例子: 假设有一台 client 想要实现不同的业务,就需要调用接口 ...
- vivo悟空活动中台 - 微组件多端探索
本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/oGX4XSm8F4fa1ocLdpyqlA作者:悟空中台研发团队 [悟空活动中台]系列往期精 ...
- 数字孪生智慧物流之 Web GIS 地图应用
前言 随着数字经济时代的来临,新一轮全球化进程速度加快,在大数据.人工智能.物联网等高新技术深度融合下,加快催化智慧物流发展,引领物流行业划入全新时代. 从物流运输到货物分拣再到站点配送,图扑软件数据 ...
- java字符串与json互转
开发中经常遇到将字符串转成json和字符串转成json属组的方法,网上搜到的方法,好多都是不好用的,今天这里记录一下方便自己今后查看,也提供给需要的人. 依赖: <!-- 处理json --&g ...
- C#设计模式13——建造者模式的写法
1. 什么是建造者模式? 建造者模式是一种创建型设计模式,它通过将一个复杂的对象分解为多个简单的对象并按照一定的顺序进行组装而创建出一个复杂的对象.这样可以使得构造过程更加灵活,同时也可以隐藏创建过程 ...
- [转帖]tcplife的使用
https://www.rutron.net/posts/2203/bcc-tcplife-usage/ 这篇文档主要演示了 tcplife(Linux eBPF/bcc) 工具的使用. 示例 tcp ...
- [转帖]OceanBase 中租户管理
https://zhuanlan.zhihu.com/p/464504887 概述 租户的概念类似于传统数据库的数据库实例.租户也叫实例,拥有一定的资源能力(如CPU.内存和空间).租户下可以建立数据 ...
- [转帖]LSM-Tree:从入门到放弃——入门:基本概念、操作和Trade-Off分析
https://zhuanlan.zhihu.com/p/428267241 LSM-Tree,全程为日志结构合并树,有趣的是,这个数据结构实际上重点在于日志结构合并,和 tree 本身的关系并不是特 ...