基于iTextSharp的PDF文档操作

简介:   公司是跨境电商,需要和各种物流打交道,需要把东西交给物流,让他们发到世界各地。其中需要物流公司提供一个运单号,来追踪货物到达哪里?!   最近在和DHL物流公司(应该是个大公司)对接,取运单号的方式是调用对方提供的API,简单说,就是我们传一些发货地址和客户信息,要发的货物等,对方返回一个运单号和物流面单(就是我们淘宝快递上的面单)。

  公司是跨境电商,需要和各种物流打交道,需要把东西交给物流,让他们发到世界各地。其中需要物流公司提供一个运单号,来追踪货物到达哪里?!

  最近在和DHL物流公司(应该是个大公司)对接,取运单号的方式是调用对方提供的API,简单说,就是我们传一些发货地址和客户信息,要发的货物等,对方返回一个运单号和物流面单(就是我们淘宝快递上的面单)。过程呢,还是比较顺利的,经过一系列沟通,最终还是实现了功能

  下面还是说说没有实现的功能,如果都实现了,也不用写这篇博客了。不足之处在于DHL提供的面单,没有提供要拣哪些货的面单。本来一个完整的面单,包括2部分:物流公司需要贴在包裹上的面单(物流面单)和我们自己发货部门要发哪些东西的面单(拣货面单),两部分组合在一起,发货部门才能正常的完成这个包裹的发货

  好吧,终于要引入正题了,DHL公司将物流面单以pdf文件流的形式返回,就是我们可以保存成Pdf文件,这样就容易处理的多,我们自己的拣货面单,如果也可以保存至Pdf文件,这样就可以将这2个Pdf文件一块打印出来,这算是一个折中的解决方案。

  首先,要将拣货数据(含图片)保存至Pdf文档。技术点如下

    1, 将DataTable导出至Pdf

    2, DataTable中包含图片,也要能导出

    3, Pdf类库,字体的引入(居然需要引用字体的绝对路径,想不通)

  下面分别讲解

    1, 这点就是直接创建iTextSharp中的PdfDataTable对象,直接映射即可。代码如下:

private static pdfText.pdf.PdfPTable CreatePdfPTableToPickupLabel(List<TradeDetailModel> listDetail, iTextSharp.text.Font font)
{
    pdfText.pdf.PdfPTable pdtTable = new pdfText.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++)
    {
        TradeDetailModel modelDetail = listDetail[i];

        iTextSharp.text.Image image = PdfUtil.CreatePdfImage(modelDetail.ProductImageBytes);
        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, font));
    }

    return pdtTable;
}

    2, 这点要先生成iTextSharp中Image对象才可以,然后再随生成PdfDataTable中,将Image对象插入单元格(注意:图片尺寸需要定义好)。代码如下:

/// <summary>
/// 创建Pdf所需图像
/// </summary>
/// <param name="imageBytes"></param>
/// <param name="widthS"></param>
/// <param name="heightS"></param>
/// <returns></returns>
private static iTextSharp.text.Image CreatePdfImage(byte[] imageBytes, float widthS = 60f, float heightS = 60f)
{
    iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(imageBytes);

    //图片大小要求统一80x80,需根据实际图片        
    float perW = (float)Math.Round(widthS / image.Width, 2);
    float perH = (float)Math.Round(heightS / image.Height, 2);
    image.ScalePercent(perW * 100, perH * 100);

    //设置Dpi值,能够清晰些
    image.SetDpi(124, 124);

    return image;
}  

    3, 创建字体

/// <summary>
/// 创建Pdf所需字体
/// </summary>
/// <returns></returns>
public static iTextSharp.text.Font CreatePdfFont(float fontSize = 16F)
{
    //黑体
    string fontPath = @"C:\Windows\Fonts\simhei.ttf";

    iTextSharp.text.pdf.BaseFont baseFont = iTextSharp.text.pdf.BaseFont.CreateFont(fontPath,
        iTextSharp.text.pdf.BaseFont.IDENTITY_H,
        iTextSharp.text.pdf.BaseFont.NOT_EMBEDDED);
    iTextSharp.text.Font font = new iTextSharp.text.Font(baseFont, fontSize);

    return font;
}

    下面是调用的代码,仅供参考。注:返回的Pdf文件的绝对路径,用于后续打印

/// <summary>
/// 生成拣货标签pdf文件
/// </summary>
/// <param name="modelTrade"></param>
/// <param name="dhlLabelFolderName"></param>
/// <returns></returns>
public static string CreatePickupLabel(TradeModel modelTrade,string dhlLabelFolderName)
{
    //参考地址
    //https://www.cnblogs.com/yangy1989/p/5300304.html
    //http://blog.csdn.net/lideyuans/article/details/51536676 (设置图片百分比)

    //组装,待生成的pdf文件完整路径
    string logisticsNo = modelTrade.R;
    string pdfFileName = dhlLabelFolderName + logisticsNo + "_Label.pdf";

    FileStream fs = new FileStream(pdfFileName, FileMode.Create);
    pdfText.Rectangle rect = new pdfText.Rectangle(0f, 0f, 1000f, 1000f);
    pdfText.Document document = new pdfText.Document(rect, 5f, 5f, 5f, 5f);

    //创建字体
    iTextSharp.text.Font font = PdfUtil.CreatePdfFont(34F);

    pdfText.pdf.PdfWriter pdfWriter = pdfText.pdf.PdfWriter.GetInstance(document, fs);
    document.Open();

    //增加拣货单品列表
    pdfText.pdf.PdfPTable pdfpTable = PdfUtil.CreatePdfPTableToPickupLabel(modelTrade.Details, font);
    document.Add(pdfpTable);

    //增加品名备注            
    pdfText.Paragraph pgraph1 = new pdfText.Paragraph(modelTrade.ItemsDescription, font);
    document.Add(pgraph1);

    //增加:发货期限
    font.Color = pdfText.BaseColor.RED;
    pdfText.Paragraph pgraph2 = new pdfText.Paragraph(modelTrade.ShipLimitTimeText, font);
    document.Add(pgraph2);

    document.Close();
    fs.Close();

    return pdfFileName;
}

  

  再将这2个文件,通过C#代码连续打印出来。支持连续打印多个Pdf文件

//直接调用cmd命令,实现直接打印
foreach (string printFile in listPrintFile)
{
    Process proc = new Process();
    proc.StartInfo.CreateNoWindow = false;
    proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    proc.StartInfo.UseShellExecute = true;
    proc.StartInfo.FileName = printFile;
    proc.StartInfo.Verb = "print";
    proc.Start();
    proc.Close();
}

  

  好了,最后的最后,看看效果图吧。前2联是DHL返回的Pdf文件,第3联是我本地生成的Pdf文件,合并成一个完整的发货面单

 

相关文章
|
3月前
|
C# 开发者 Windows
WPF与PDF文档:解锁创建和编辑PDF文件的新技能——从环境配置到代码实践,手把手教你如何在WPF应用中高效处理PDF,提升文档管理效率
【8月更文挑战第31天】随着数字文档的普及,PDF因跨平台兼容性和高保真度成为重要格式。WPF虽不直接支持PDF处理,但借助第三方库(如iTextSharp)可在WPF应用中实现PDF的创建与编辑。本文通过具体案例和示例代码,详细介绍了如何在WPF中集成PDF库,并展示了从设计用户界面到实现PDF创建与编辑的完整流程。不仅包括创建新文档的基本步骤,还涉及在现有PDF中添加页眉页脚等高级功能。通过这些示例,WPF开发者可以更好地掌握PDF处理技术,提升应用程序的功能性和实用性。
109 0
|
3月前
[PDF提取重命名]提取识别文字并对PDF文件批量重命名,提取PDF指定可复制的内容并批量重命名PDF,批量PDF文档指定识别提取区域
本文介绍一款实用工具,能快速从可复制内容的PDF中提取指定区域信息并据此重命名文件。设置提取坐标及导入PDF文档、设定新文件名后启动提取流程,即可高效批量处理。保存坐标设置以便重复使用,适用于需频繁修改大量PDF文件名的场景。
225 0
[PDF提取重命名]提取识别文字并对PDF文件批量重命名,提取PDF指定可复制的内容并批量重命名PDF,批量PDF文档指定识别提取区域
|
3月前
|
开发框架 前端开发 JavaScript
在Winform分页控件中集成导出PDF文档的功能
在Winform分页控件中集成导出PDF文档的功能
|
4月前
|
JavaScript Java
Java 将Markdown文件转换为Word和PDF文档
【7月更文挑战第5天】Java中使用`Spire.Doc for Java`库可方便地将Markdown转换为Word或PDF。基本步骤包括导入模块,创建`Document`对象,加载Markdown文件,然后保存为目标格式(`.docx`或`.pdf`)。若遇到`Invalid UTF-8 stream`错误,需确保Markdown文件是UTF-8无BOM编码。页面设置可通过`PageSetup`类调整。注意,实际应用会依据具体需求和环境有所调整。
235 6
|
4月前
|
JavaScript 数据库
文本,在线浏览PDF,一个最简单的文档标准样式,文档预览非常简单的样式,文档管理样式设计,标准,好的设计
文本,在线浏览PDF,一个最简单的文档标准样式,文档预览非常简单的样式,文档管理样式设计,标准,好的设计
|
4月前
|
Unix Linux Shell
Sphinx是一个Python文档生成工具,它可以解析reStructuredText或Markdown格式的源代码注释,并生成多种输出格式,如HTML、LaTeX、PDF、ePub等。
Sphinx是一个Python文档生成工具,它可以解析reStructuredText或Markdown格式的源代码注释,并生成多种输出格式,如HTML、LaTeX、PDF、ePub等。
|
5月前
|
Java 数据安全/隐私保护
Java使用PDFBox开发包实现对PDF文档内容编辑与保存
Java使用PDFBox开发包实现对PDF文档内容编辑与保存
213 7
|
5月前
|
编解码 文字识别
印刷文字识别操作报错合集之在尝试将PDF文件转换为图片时出现了问题,具体的错误代码是415,该怎么处理
在使用印刷文字识别(OCR)服务时,可能会遇到各种错误。例如:1.Java异常、2.配置文件错误、3.服务未开通、4.HTTP错误码、5.权限问题(403 Forbidden)、6.调用拒绝(Refused)、7.智能纠错问题、8.图片质量或格式问题,以下是一些常见错误及其可能的原因和解决方案的合集。
|
5月前
使用LabVIEW打开默认应用程序中的文档(PDF,Word,Excel,Html)
使用LabVIEW的&quot;Open a Document on Disk.vi&quot;,存于&lt;LabVIEW&gt;\vi.lib\Platform\browser.llb,可让默认应用打开硬盘文档。此VI仅基础打开功能,高级控制推荐LabVIEW Report Generation Toolkit或ActiveX。注意:避免版本升级问题,最好将VI复制到vi.lib外的目录。
225 3
|
5月前
|
XML Java 数据处理
视觉智能开放平台操作报错合集之pdf识别报503,是什么导致的
在使用视觉智能开放平台时,可能会遇到各种错误和问题。虽然具体的错误代码和消息会因平台而异,但以下是一些常见错误类型及其可能的原因和解决策略的概述,包括但不限于:1. 认证错误、2. 请求参数错误、3. 资源超限、4. 图像质量问题、5. 服务不可用、6. 模型不支持的场景、7. 网络连接问题,这有助于快速定位和解决问题。