小Q的博客

  • 首页
  • net编程
    • 产品和框架
    • 开发实例
    • 经验技巧
    • 开源组件
  • wp独立站
  • 自媒体
  • 日记本
  • 工具箱
每个程序员,都应该有一个自己的博客站
  1. 首页
  2. net编程
  3. 经验技巧
  4. 正文

net中c#教程 如何创建、合并、下载、打印pdf文件?

2022年11月22日 2513点热度 0人点赞 2条评论

net中c#操作pdf文档,有很多插件可以使用,这里推荐其中的一个,名字叫iTextSharp,Nuget直接搜就可以找到。它能够创建与合并pdf文件。至于下载和打印pdf文件,则是通过其他方法完成的。

PS:文末提供源码下载地址

nuget中搜索iTextSharp

今天要完成的这个业务场景,也是跨境电商公司需要的。先从速卖通或Shopee平台上下载一个物流面单,本地需要生成这个订单的拣货单(就是订单需要发什么货,数量是多少,库位在哪里,都是让发货的人知道),最后再把这2个PDF文件合并,再打印出来。

发货单+拣货单

Table of Contents

Toggle
  • 1、下载Pdf文件
    • 1.1、Base64字符串
    • 1.2、Url地址
    • 1.3、二进制文件流
  • 2、创建Pdf文件
    • 2.1,创建PdfTable对象
    • 2.2,创建Paragrapth对象
  • 3、合并Pdf文件
  • 4、打印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,来实现数据导出,效果也不错

PdfUtil.cs源码下载

 

相关阅读

net中c#教程 image图形操作,支持webp和svg格式

winform程序调取迅雷下载页面 让你的程序更上档次

标签: c#教程 net教程 pdf文件下载 pdf文件创建 pdf文件合并 pdf文件打印
最后更新:2022年11月22日

小Q

80后中年不油腻大叔,喜欢编写代码、打羽毛球、做木制玩具。目前定居浙江杭州

打赏 点赞
< 上一篇
下一篇 >

文章评论

  • stevenchen

    你用的是什么版本的。我这句代码总是报错PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(merFilePath, FileMode.Create));异常System.NullReferenceException:“Object reference not set to an instance of an object.”

    2023年2月4日
    回复
    • 小Q

      @stevenchen 就是nuget里的最新版,net4.6版

      2023年3月24日
      回复
  • razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
    取消回复

    COPYRIGHT © 2022 小Q的博客. ALL RIGHTS RESERVED.

    Theme Kratos Made By Seaton Jiang

    浙ICP备2022019157号-2