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版