首页 > 编程语言 >c# 在PDFsharp里绘制ZXing生成的条形码矢量图

c# 在PDFsharp里绘制ZXing生成的条形码矢量图

时间:2024-09-18 12:34:48浏览次数:1  
标签:matrix 矢量图 startPosX c# PDFsharp ZXing int new startPosY

PDFsharp支持 在pdf文档里生成矢量格式的二维码, 单支持的条码格式比较少,不支持常用的93码和二维码等。
ZXing 支持的条码多,但无法在PDFsharp里直接绘制矢量格式的图形。
这里一个扩展就可以 在PDFsharp里绘制ZXing生成的条形码矢量图了。

使用方法:

using PdfSharp.Drawing;
using PdfSharp.Pdf;
using ZXing;
using ZXing.Common;
using Extensions; //引入扩展

PdfDocument newDocument = new PdfDocument(); // 创建pdf文档
PdfPage page = newDocument.AddPage();   //添加页面
XGraphics gfx = XGraphics.FromPdfPage(page); 
var barcodeWriter = new ZXing.BarcodeWriterGeneric
{
    Format = BarcodeFormat.CODE_93, //条码格式
    Options = new EncodingOptions { Height = 80, Width = 200 } //条码尺寸
};
var bitMatrix = barcodeWriter.Encode("24341873"); //条码内容
gfx.DrawBitMatrix(bitMatrix, new XPoint(100, 100));  //绘制条码
newDocument.Save("output.pdf");   //保存文件
newDocument.Close();

 

扩展: XGraphicsExtensions.cs

using PdfSharp.Drawing;
using ZXing.Common;
namespace Extensions
{
    public static class XGraphicsExtensions
    {
        public static void DrawBitMatrix(this XGraphics gfx, BitMatrix matrix, XPoint offset)
        {
            if (matrix == null)
                return;
            int width = matrix.Width;
            int height = matrix.Height;
            var processed = new BitMatrix(width, height);
            bool currentIsBlack = false;
            int startPosX = 0;
            int startPosY = 0;
            //test border
            //gfx.DrawRectangle(new XPen(XColor.FromArgb(0, 0, 0), 0.5), new XRect(offset.X, offset.Y, matrix.Width, matrix.Height));
            for (int x = 0; x < width; x++)
            {
                int endPosX;
                for (int y = 0; y < height; y++)
                {
                    if (processed[x, y])
                        continue;

                    processed[x, y] = true;

                    if (matrix[x, y])
                    {
                        if (!currentIsBlack)
                        {
                            startPosX = x;
                            startPosY = y;
                            currentIsBlack = true;
                        }
                    }
                    else
                    {
                        if (currentIsBlack)
                        {
                            FindMaximumRectangle(matrix, processed, startPosX, startPosY, y, out endPosX);
                            var rect = new XRect(startPosX + offset.X, startPosY + offset.Y, endPosX - startPosX + 1, y - startPosY);
                            gfx.DrawRectangle(XBrushes.Black, rect);
                            currentIsBlack = false;
                        }
                    }
                }
                if (currentIsBlack)
                {
                    FindMaximumRectangle(matrix, processed, startPosX, startPosY, height, out endPosX);
                    var rect = new XRect(startPosX + offset.X, startPosY + offset.Y, endPosX - startPosX + 1, height - startPosY);
                    gfx.DrawRectangle(XBrushes.Black, rect);
                    currentIsBlack = false;
                }
            }
        }
        private static void FindMaximumRectangle(BitMatrix matrix, BitMatrix processed, int startPosX, int startPosY, int endPosY, out int endPosX)
        {
            endPosX = startPosX;

            for (int x = startPosX + 1; x < matrix.Width; x++)
            {
                for (int y = startPosY; y < endPosY; y++)
                {
                    if (!matrix[x, y])
                    {
                        return;
                    }
                }
                endPosX = x;
                for (int y = startPosY; y < endPosY; y++)
                {
                    processed[x, y] = true;
                }
            }
        }
    }
}

  

 

标签:matrix,矢量图,startPosX,c#,PDFsharp,ZXing,int,new,startPosY
From: https://www.cnblogs.com/redpod/p/18418255

相关文章

  • Excel 国产化替换新方案
    前言在当前数字化转型和信创(信息技术应用创新)战略背景下,企业对于安全性、自主可控性和高效办公工具的需求日益增加。作为一款国产自主研发的高性能表格控件,SpreadJS正成为替换Excel的最佳选择。它不仅全面支持国产化认证,还在多功能、跨平台适配、灵活定制、对接AI大模型等方面......
  • [赛记] csp-s模拟2
    不相邻集合64pts赛时打的用$set$打的假做法A了,但是没敢交,整了个暴力64pts;可以发现,对于给定的一个序列,我们只需研究每个数一次就行,因为如果一个数出现多次,答案是不变的;我们又可以发现,对于一个连续段(比如12345,其答案最多为$\lceil\fracn2\rceil$,其中$n$为......
  • GEE 案例:利用UCSB-CHG/CHIRPS/DAILY数据采用非监督分类实现某区域的降水区域的划分
    目录简介数据函数ee.Clusterer.wekaKMeans(nClusters, init, canopies, maxCandidates, periodicPruning, minDensity, t1, t2, distanceFunction, maxIterations, preserveOrder, fast, seed)Arguments:Returns: Clusterer代码结果简介利用UCSB-CHG......
  • Java结合WebSocket 实现简单实时双人协同 pk 答题
    引入实现过程WebSocket后端1、实体类2、异常处理类3、游戏状态枚举类4、ws主类5、配置类及工具类引入引入与技术选型:在实时互动应用中,实现流畅的多人协同对战功能是一大挑战。WebSocket技术,以其全双工通信能力,提供了解决方案。不同于传统HTTP请求的短连接,WebSocket建立持久连接,极......
  • unable to find a medium containing a live file system
    所有方法尝试了,仍然没有解决问题,refus、UltraISO都尝试重新做了启动盘……在尝试使用U盘安装Ubuntu时遇到“unabletofindamediumcontainingalivefilesystem”的错误,可能是由多种原因引起的。以下是一些可能的解决方案:检查ISO文件的完整性:确保你下载的UbuntuISO文件......
  • PyQt / PySide + Pywin32 + ctypes 自定义标题栏窗口 + 完全还原 Windows 原生窗口边
    项目地址:GitHub-github201014/PyQt-NativeWindow:AclassofwindowincludenativeEvent,usePySideorPyQtandPywin32andctypesAclassofwindowincludenativeEvent,usePySideorPyQtandPywin32andctypes-github201014/PyQt-NativeWindowhttps://githu......
  • Java.lang.CloneNotSupportedException 不支持克隆异常
    java.lang.CloneNotSupportedException是Java中表示一个对象无法被克隆的异常。在Java中,对象的克隆是通过实现Cloneable接口和重写Object类中的clone()方法来完成的。如果一个类没有实现Cloneable接口,并且尝试调用其clone()方法,那么就会抛出CloneNotSupportedExcep......
  • Java调用Apache commons-text求解字符串相似性
    前言    在之前的一篇漂亮国的全球的基地博客中,我们曾经对漂亮国的全球基地进行了一些梳理。博文中使用的数据来源,重点是参考以为博主分享的KML的数据,同时针对其国内的基地部署信息,我们从互联网百科的数据中搜寻到一些。其实拿到这两份数据的时候,是存在一些问题的,比如,KML的......
  • 如何在 Cloudflare Page 上建立自己的 Hexo 博客
    本文首发于我的博客,部分图片和步骤来自在GitHubDesktop中向GitHub进行身份验证-GitHub文档0前置条件0.1安装Node.js打开nodejs.org,点击下载Node.js下载完毕后双击图标然后按Next点IacceptthetermsintheLicenseAgreement,再按Next然后一......
  • YOLOv8改进 - 注意力篇 - 引入CBAM注意力机制
    一、本文介绍作为入门性第一篇,这里介绍了CBAM注意力在YOLOv8中的使用。包含CBAM原理分析,CBAM的代码、CBAM的使用方法、以及添加以后的yaml文件及运行记录。二、CBAM原理分析CBAM官方论文地址:CBAM论文CBAM的pytorch版代码:CBAM的pytorch版代码CBAM:卷积块注意力模块,由通道......