net中c#操作pdf文档,有很多插件可以使用,这里推荐其中的一个,名字叫iTextSharp,Nuget直接搜就可以找到。它能够创建与合并pdf文件。至于下载和打印pdf文件,则是通过其他方法完成的。
PS:文末提供源码下载地址
今天要完成的这个业务场景,也是跨境电商公司需要的。先从速卖通或Shopee平台上下载一个物流面单,本地需要生成这个订单的拣货单(就是订单需要发什么货,数量是多少,库位在哪里,都是让发货的人知道),最后再把这2个PDF文件合并,再打印出来。
1、下载Pdf文件
下载文件之前,要看服务端是如何提供Pdf数据的。有的提供Base64字符串、有的提供一个Url地址、有的提供二进制文件流。
1.1、Base64字符串
这种格式最简单,当成普通的字符串下载下来,再转成Pdf文件即可
1.2、Url地址
这种也不复杂,直接下载即可,使用WebClient这个组件即可,代码如下
/// <summary>
/// 下载Pdf文件
/// </summary>
/// <param name="pdfUrlPath">Pdf文件地址</param>
/// <param name="pdfLocalFile">Pdf本地路径</param>
public static void DownloadPdf(string pdfUrlPath,string pdfLocalFile)
{
WebClient wc = new WebClient();
byte[] buffer = wc.DownloadData(pdfUrlPath);
FileStream fileStream = new FileStream(pdfLocalFile, FileMode.Create);
fileStream.Write(buffer, 0, buffer.Length);
fileStream.Close();
}
1.3、二进制文件流
这种要复杂些,我是用ResetSharp这个组件实现的,代码如下
//使用ResetSharp(ok)
RestSharp.RestClient client = new RestSharp.RestClient(urlPath);
var request = new RestSharp.RestRequest(RestSharp.Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", jsonP, RestSharp.ParameterType.RequestBody);
RestSharp.IRestResponse response = client.Execute(request);
FileStream fileStream = new FileStream(pdfLocalFile, FileMode.Create);
fileStream.Write(response.RawBytes, 0, response.RawBytes.Length);
fileStream.Close();
//若没报错误,就返回空
return string.Empty;
2、创建Pdf文件
拣货单中要发货的单品会有多条,这里会用到PdfPTable这个对象;还会有订单的一些信息,包括订单号、下单时间、过期时间等,这里用到的是Paragraph对象。
2.1,创建PdfTable对象
/// <summary>
/// 组装拣货标签,即单品列表
/// </summary>
/// <param name="listDetail"></param>
/// <param name="font"></param>
/// <returns></returns>
private static iTextSharp.text.pdf.PdfPTable CreatePdfPTableToPickupLabel(List<OrderDetailModel> listDetail, iTextSharp.text.Font font)
{
iTextSharp.text.pdf.PdfPTable pdtTable = new iTextSharp.text.pdf.PdfPTable(5);
pdtTable.WidthPercentage = 95; //占宽度百分比:95%
int[] colWidth = { 2, 4, 2, 2, 2 }; //设置列宽比例
pdtTable.SetWidths(colWidth);
//此处,先插入首行,即标题
pdtTable.AddCell(new iTextSharp.text.Phrase("图片", font));
pdtTable.AddCell(new iTextSharp.text.Phrase("基本信息", font));
pdtTable.AddCell(new iTextSharp.text.Phrase("单价", font));
pdtTable.AddCell(new iTextSharp.text.Phrase("数量", font));
pdtTable.AddCell(new iTextSharp.text.Phrase("备注", font));
//再插入真实拣货数据
int rowCount = listDetail.Count;
for (int i = 0; i < rowCount; i++)
{
OrderDetailModel modelDetail = listDetail[i];
iTextSharp.text.Image image = PdfUtil.CreatePdfImage(modelDetail.ProductImageBytes, modelDetail.ProductImageUrl, 100f, 100f);
pdtTable.AddCell(image);
pdtTable.AddCell(new iTextSharp.text.Phrase(modelDetail.ProductBase, font));
pdtTable.AddCell(new iTextSharp.text.Phrase(modelDetail.Price.ToString() + Environment.NewLine + modelDetail.ProductID, font));
pdtTable.AddCell(new iTextSharp.text.Phrase(modelDetail.Number.ToString() + Environment.NewLine + modelDetail.ProductSpec, font));
pdtTable.AddCell(new iTextSharp.text.Phrase(modelDetail.Remark + Environment.NewLine
+ "销售数量:" + modelDetail.SaleQty + Environment.NewLine
+ "销售个数:" + modelDetail.SaleCount, font));
}
return pdtTable;
}
2.2,创建Paragrapth对象
//增加:发货期限 font.Color = iTextSharp.text.BaseColor.RED; iTextSharp.text.Paragraph pgraph2 = new iTextSharp.text.Paragraph(modelTrade.ShipLimitTimeText, font); document.Add(pgraph2);
3、合并Pdf文件
这里的合并就是最简单的多个文件合并到一个文件,没有其他操作。所以,合并后的文件大小,就是每个文件的和。
/// <summary>
/// 合并Pdf文件
/// </summary>
/// <param name="fileNames">PDF文件列表</param>
/// <param name="targetPdf">合并的目标PDF文件路径(完全路径,包含绝对路径以及文件名)</param>
/// <returns></returns>
public static void MergePdfs(IEnumerable<string> fileNames, string targetPdf)
{
using (FileStream stream = new FileStream(targetPdf, FileMode.Create))
{
iTextSharp.text.Document document = new iTextSharp.text.Document();
iTextSharp.text.pdf.PdfCopy pdf = new iTextSharp.text.pdf.PdfCopy(document, stream);
iTextSharp.text.pdf.PdfReader reader = null;
try
{
document.Open();
foreach (string file in fileNames)
{
reader = new iTextSharp.text.pdf.PdfReader(file);
pdf.AddDocument(reader);
reader.Close();
}
}
catch (Exception)
{
if (reader != null)
{
reader.Close();
}
}
finally
{
if (document != null)
{
document.Close();
}
}
}
}
4、打印Pdf文件
这个功能用的是cmd命令行操作,执行以下代码就行了
/// <summary>
/// 打印Pdf文件
/// </summary>
/// <param name="pdfLocalFile"></param>
public static void PrintPdf(string pdfLocalFile)
{
Process proc = new Process();
proc.StartInfo.CreateNoWindow = false;
proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
proc.StartInfo.UseShellExecute = true;
proc.StartInfo.FileName = pdfLocalFile;
proc.StartInfo.Verb = "print";
proc.Start();
proc.Close();
}
所有需求都是用iTextSharp这个组件实现的,后面一篇将介绍另一个Pdf组件,名字叫Magicodes.IE,来实现数据导出,效果也不错
相关阅读


文章评论
你用的是什么版本的。我这句代码总是报错PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(merFilePath, FileMode.Create));异常System.NullReferenceException:“Object reference not set to an instance of an object.”
@stevenchen 就是nuget里的最新版,net4.6版