Spire高效稳定的.NET组件

年末将至,又到了一年一度的收集发票时间,平时零零碎碎的花钱都是不在意开发票,现在好了,到处找发票来报销,简直头大,

Spire高效稳定的.NET组件

东拼西凑,终于搞定了全部发票,大伙多余的发票,麻烦艾特我一下啊,不限日期,能开发票的都可以,谢谢啦。 文章后有彩蛋~

Spire高效稳定的.NET组件

这么多的发票,一张一张打印,要浪费我多少时间,就想着 合并这些PDF文件(发票)一起打印,节省时间。

还寻思这网上找一个软件来使使,都很(méi)委(līang)婉(xīn)的想收费,在线转PDF的还给我打水印,恰巧今天公司网速不行。

来吧,自己搞!程序猿没有什么不可能!

Spire.PDF

NPOI、DocX、Epplus……这些开源且免费的优秀组件,大家应该是耳熟能详的,而Spire是一款企业级的收费组件,Spire.PDF for .NET

是一个专业的PDF组件,用于在.NET应用程序中创建,编写,编辑,处理和阅读PDF文件,功能十分丰富…………

提取关键词:收费、稳定、高效

具体我不再过多的啰嗦了,详细我推荐看这篇《 高效而稳定的企业级.NET Office 组件Spire(.NET组件介绍之二);

合并PDF

回到今天的问题,合并发票,合并PDF,然后一次性打印。其实吧,主要代码就两行:

1  var doc = PdfDocument.MergeFiles(allFiles.ToArray());
2  doc.Save(DateTime.Now.ToString("yyyyMMddHHmmss") + ".pdf", FileFormat.PDF);

然后,你们输出之后会发现,很(méi)漂(līang)亮(xīn)的水印:

Spire高效稳定的.NET组件

“Evaluation Warning:The document was created with Spire.PDF for .NET”

简直玷污我心爱的发票!!!!

解决

既然隐藏不了,那合并的第一页加入一个空页不就行了?!生成PDF后,然后从第二页开始打印或是删去第一页不就行了?!就这么干!

1             var first = new PdfDocument();
2             first.AppendPage();  //加入一个空页
3             for (int idx = 0; idx < allFiles.Count; idx++)
4             {
5                 var next = new PdfDocument(allFiles[idx]);
6                 first.AppendPage(next);
7             }
8             first.SaveToFile(DateTime.Now.ToString("yyyyMMddHHmmss")+".pdf", FileFormat.PDF);

Spire高效稳定的.NET组件

Spire高效稳定的.NET组件

Spire高效稳定的.NET组件

Spire高效稳定的.NET组件

Spire高效稳定的.NET组件

工具很简单,就不放到Git上去了,源码:

界面:

Spire高效稳定的.NET组件Spire高效稳定的.NET组件
namespace 合并PDF
{
    partial class mainForm
    {
        ///
        /// 必需的设计器变量。
        ///
        private System.ComponentModel.IContainer components = null;

        ///
        /// 清理所有正在使用的资源。
        ///
        /// 如果应释放托管资源,为 true;否则为 false。
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows 窗体设计器生成的代码

        ///
        /// 设计器支持所需的方法 - 不要修改
        /// 使用代码编辑器修改此方法的内容。
        ///
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.btnAdd = new System.Windows.Forms.Button();
            this.btnMerge = new System.Windows.Forms.Button();
            this.bgw = new System.ComponentModel.BackgroundWorker();
            this.listView1 = new System.Windows.Forms.ListView();
            this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
            this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
            this.btnRemove = new System.Windows.Forms.ToolStripMenuItem();
            this.statusStrip1 = new System.Windows.Forms.StatusStrip();
            this.progressBar = new System.Windows.Forms.ToolStripProgressBar();
            this.tipStatu = new System.Windows.Forms.ToolStripStatusLabel();
            this.btnSplit = new System.Windows.Forms.Button();
            this.contextMenuStrip1.SuspendLayout();
            this.statusStrip1.SuspendLayout();
            this.SuspendLayout();
            //
            // btnAdd
            //
            this.btnAdd.Location = new System.Drawing.Point(409, 12);
            this.btnAdd.Name = "btnAdd";
            this.btnAdd.Size = new System.Drawing.Size(67, 24);
            this.btnAdd.TabIndex = 2;
            this.btnAdd.Text = "添加文件";
            this.btnAdd.UseVisualStyleBackColor = true;
            this.btnAdd.Click += new System.EventHandler(this.btnSearch_Click);
            //
            // btnMerge
            //
            this.btnMerge.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
            this.btnMerge.Location = new System.Drawing.Point(409, 43);
            this.btnMerge.Name = "btnMerge";
            this.btnMerge.Size = new System.Drawing.Size(67, 24);
            this.btnMerge.TabIndex = 3;
            this.btnMerge.Text = "开始合并";
            this.btnMerge.UseVisualStyleBackColor = true;
            this.btnMerge.Click += new System.EventHandler(this.btnMerge_Click);
            //
            // bgw
            //
            this.bgw.WorkerReportsProgress = true;
            this.bgw.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bgw_DoWork);
            this.bgw.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.bgw_ProgressChanged);
            this.bgw.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.bgw_RunWorkerCompleted);
            //
            // listView1
            //
            this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
            this.columnHeader1});
            this.listView1.ContextMenuStrip = this.contextMenuStrip1;
            this.listView1.FullRowSelect = true;
            this.listView1.GridLines = true;
            this.listView1.Location = new System.Drawing.Point(12, 12);
            this.listView1.MultiSelect = false;
            this.listView1.Name = "listView1";
            this.listView1.Size = new System.Drawing.Size(391, 190);
            this.listView1.TabIndex = 4;
            this.listView1.UseCompatibleStateImageBehavior = false;
            this.listView1.View = System.Windows.Forms.View.Details;
            //
            // columnHeader1
            //
            this.columnHeader1.Text = "文件";
            this.columnHeader1.Width = 350;
            //
            // contextMenuStrip1
            //
            this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
            this.btnRemove});
            this.contextMenuStrip1.Name = "contextMenuStrip1";
            this.contextMenuStrip1.Size = new System.Drawing.Size(101, 26);
            //
            // btnRemove
            //
            this.btnRemove.Name = "btnRemove";
            this.btnRemove.Size = new System.Drawing.Size(100, 22);
            this.btnRemove.Text = "移除";
            this.btnRemove.Click += new System.EventHandler(this.btnRemove_Click);
            //
            // statusStrip1
            //
            this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
            this.progressBar,
            this.tipStatu});
            this.statusStrip1.Location = new System.Drawing.Point(0, 205);
            this.statusStrip1.Name = "statusStrip1";
            this.statusStrip1.Size = new System.Drawing.Size(488, 22);
            this.statusStrip1.TabIndex = 5;
            this.statusStrip1.Text = "statusStrip1";
            //
            // progressBar
            //
            this.progressBar.Name = "progressBar";
            this.progressBar.Size = new System.Drawing.Size(100, 16);
            //
            // tipStatu
            //
            this.tipStatu.Name = "tipStatu";
            this.tipStatu.Size = new System.Drawing.Size(27, 17);
            this.tipStatu.Text = "0/0";
            //
            // btnSplit
            //
            this.btnSplit.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
            this.btnSplit.Location = new System.Drawing.Point(409, 73);
            this.btnSplit.Name = "btnSplit";
            this.btnSplit.Size = new System.Drawing.Size(67, 24);
            this.btnSplit.TabIndex = 6;
            this.btnSplit.Text = "开始拆分";
            this.btnSplit.UseVisualStyleBackColor = true;
            this.btnSplit.Click += new System.EventHandler(this.btnSplit_Click);
            //
            // mainForm
            //
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(488, 227);
            this.Controls.Add(this.btnSplit);
            this.Controls.Add(this.statusStrip1);
            this.Controls.Add(this.listView1);
            this.Controls.Add(this.btnMerge);
            this.Controls.Add(this.btnAdd);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
            this.MaximizeBox = false;
            this.MaximumSize = new System.Drawing.Size(504, 266);
            this.MinimumSize = new System.Drawing.Size(504, 266);
            this.Name = "mainForm";
            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            this.Text = "PDF Merge";
            this.contextMenuStrip1.ResumeLayout(false);
            this.statusStrip1.ResumeLayout(false);
            this.statusStrip1.PerformLayout();
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion
        private System.Windows.Forms.Button btnAdd;
        private System.Windows.Forms.Button btnMerge;
        private System.ComponentModel.BackgroundWorker bgw;
        private System.Windows.Forms.ListView listView1;
        private System.Windows.Forms.ColumnHeader columnHeader1;
        private System.Windows.Forms.StatusStrip statusStrip1;
        private System.Windows.Forms.ToolStripProgressBar progressBar;
        private System.Windows.Forms.ToolStripStatusLabel tipStatu;
        private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
        private System.Windows.Forms.ToolStripMenuItem btnRemove;
        private System.Windows.Forms.Button btnSplit;
    }
}

View Code

后台:

Spire高效稳定的.NET组件Spire高效稳定的.NET组件
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
using Spire.Pdf;
using System.Threading;
using Spire.Pdf.Graphics;
using System.Drawing;
using System.IO;

namespace 合并PDF{ public partial class mainForm : Form { public mainForm() { InitializeComponent(); }
    List</span>&lt;<span>string</span>&gt; allFiles = <span>new</span> List&lt;<span>string</span>&gt;<span>();
    </span><span>private</span> <span>void</span> btnSearch_Click(<span>object</span><span> sender, EventArgs e)
    {
        OpenFileDialog openFile </span>= <span>new</span><span> OpenFileDialog();
        openFile.Filter </span>= <span>&quot;</span><span>PDF&#x6587;&#x4EF6;|*.pdf</span><span>&quot;</span><span>;
        openFile.Multiselect </span>= <span>true</span><span>;
        </span><span>if</span> (openFile.ShowDialog() ==<span> DialogResult.OK)
        {
            </span><span>foreach</span> (<span>var</span> fi <span>in</span><span> openFile.FileNames)
            {
                </span><span>if</span><span> (allFiles.Contains(fi))
                    </span><span>continue</span><span>;
                </span><span>this</span>.listView1.Items.Add(<span>new</span><span> ListViewItem(fi));
                allFiles.Add(fi);
            }
            progressBar.Minimum </span>= <span>0</span><span>;
            progressBar.Maximum </span>=<span> allFiles.Count;
        }
    }

    </span><span>bool</span> bMerge = <span>false</span><span>;
    </span><span>private</span> <span>void</span> btnMerge_Click(<span>object</span><span> sender, EventArgs e)
    {
        </span><span>if</span> (!<span>bgw.IsBusy)
        {
            </span><span>if</span> (allFiles.Count <=>1<span>)
            {
                MessageBox.Show(</span><span>&quot;</span><span>&#x8BF7;&#x81F3;&#x5C11;&#x9009;&#x62E9; 2 &#x4E2A;PDF&#x6587;&#x4EF6;</span><span>&quot;</span><span>);
                </span><span>return</span><span>;
            }
            CtrlStatu(</span><span>false</span><span>);
            bMerge </span>= <span>true</span><span>;
            bgw.RunWorkerAsync();
        }
    }

    </span><span>void</span><span> Merge()
    {
        </span><span>var</span> first = <span>new</span><span> PdfDocument();
        first.AppendPage();  </span><span>//</span><span>&#x52A0;&#x5165;&#x4E00;&#x4E2A;&#x7A7A;&#x9875;</span>
        <span>for</span> (<span>int</span> idx = <span>0</span>; idx &lt; allFiles.Count; idx++<span>)
        {
            </span><span>var</span> next = <span>new</span><span> PdfDocument(allFiles[idx]);
            first.AppendPage(next);
            ReportInfo(idx </span>+ <span>1</span><span>, allFiles.Count);
            Thread.Sleep(</span><span>100</span><span>);
        }
        first.SaveToFile(DateTime.Now.ToString(</span><span>&quot;</span><span>yyyyMMddHHmmss</span><span>&quot;</span>) + <span>&quot;</span><span>.pdf</span><span>&quot;</span><span>, FileFormat.PDF);
    }

    </span><span>private</span> <span>void</span> CtrlStatu(<span>bool</span><span> b)
    {
        listView1.Enabled </span>=<span> b;
        btnMerge.Enabled </span>=<span> b;
        btnAdd.Enabled </span>=<span> b;
    }

    </span><span>private</span> <span>void</span> bgw_DoWork(<span>object</span><span> sender, DoWorkEventArgs e)
    {
        </span><span>if</span><span> (bMerge)
        {
            Merge();
        }
        </span><span>if</span><span> (bSplit)
        {
            Split();
        }
    }

    </span><span>///</span>
    <span>///</span><span> &#x8F93;&#x51FA;&#x6D88;&#x606F;
    </span><span>///</span>
    <span>public</span> <span>void</span> ReportInfo(<span>int</span> idx, <span>int</span><span> count)
    {
        bgw.ReportProgress(</span><span>1</span>, idx + <span>&quot;</span><span>/</span><span>&quot;</span> +<span> count);
    }

    </span><span>private</span> <span>void</span> bgw_ProgressChanged(<span>object</span><span> sender, ProgressChangedEventArgs e)
    {
        </span><span>var</span> userState =<span> e.UserState.ToString();
        tipStatu.Text </span>=<span> userState;
        progressBar.Value </span>= Convert.ToInt32(userState.Split(<span>&apos;</span><span>/</span><span>&apos;</span>)[<span>0</span><span>]);
    }

    </span><span>private</span> <span>void</span> bgw_RunWorkerCompleted(<span>object</span><span> sender, RunWorkerCompletedEventArgs e)
    {
        tipStatu.Text </span>= <span>&quot;</span><span>&#x5B8C;&#x6210;...</span><span>&quot;</span><span>;
        CtrlStatu(</span><span>true</span><span>);
        bMerge </span>= bSplit = <span>false</span><span>;
    }

    </span><span>private</span> <span>void</span> btnRemove_Click(<span>object</span><span> sender, EventArgs e)
    {
        </span><span>if</span> (<span>this</span>.listView1.SelectedItems.Count &gt; <span>0</span><span>)
        {
            </span><span>int</span> idx = <span>this</span>.listView1.SelectedItems[<span>0</span><span>].Index;
            allFiles.Remove(</span><span>this</span>.listView1.SelectedItems[<span>0</span><span>].Text);
            </span><span>this</span><span>.listView1.Items[idx].Remove();
        }
    }

    </span><span>bool</span> bSplit = <span>false</span><span>;
    </span><span>private</span> <span>void</span> btnSplit_Click(<span>object</span><span> sender, EventArgs e)
    {
        </span><span>if</span> (!<span>bgw.IsBusy)
        {
            </span><span>if</span> (allFiles.Count &lt; <span>1</span><span>)
            {
                MessageBox.Show(</span><span>&quot;</span><span>&#x8BF7;&#x81F3;&#x5C11;&#x9009;&#x62E9; 1 &#x4E2A;PDF&#x6587;&#x4EF6;</span><span>&quot;</span><span>);
                </span><span>return</span><span>;
            }
            CtrlStatu(</span><span>false</span><span>);
            bSplit </span>= <span>true</span><span>;
            bgw.RunWorkerAsync();
        }
    }
    </span><span>void</span><span> Split()
    {
        </span><span>var</span> dir = System.Windows.Forms.Application.StartupPath + <span>&quot;</span><span>\\&#x62C6;&#x5206;</span><span>&quot;</span><span>;
        </span><span>if</span> (!<span>Directory.Exists(dir))
        {
            Directory.CreateDirectory(dir);
        }
        </span><span>string</span> path = <span>&quot;&quot;</span><span>;
        PdfTextLayout format </span>= <span>new</span><span> PdfTextLayout();
        format.Break </span>=<span> PdfLayoutBreakType.FitPage;
        format.Layout </span>=<span> PdfLayoutType.Paginate;

        </span><span>string</span> curTime = DateTime.Now.ToString(<span>&quot;</span><span>yyyyMMddHHmmss</span><span>&quot;</span><span>);
        </span><span>for</span> (<span>int</span> idx = <span>0</span>; idx &lt; allFiles.Count; idx++<span>)
        {
            PdfDocument pdf </span>= <span>new</span><span> PdfDocument();
            FileInfo file </span>= <span>new</span><span> FileInfo(allFiles[idx]);
            </span><span>string</span> fileName = file.Name.Replace(file.Extension, <span>&quot;&quot;</span><span>);
            pdf.LoadFromFile(allFiles[idx]);

            path </span>= <span>string</span>.Format(<span>&quot;</span><span>{0}\\{1}_</span><span>&quot;</span>,dir, fileName) + <span>&quot;</span><span>&#x7B2C;{0}&#x9875;_</span><span>&quot;</span>+curTime+<span>&quot;</span><span>.pdf</span><span>&quot;</span><span>;
            pdf.Split(path);
            pdf.Close();
            ReportInfo(idx </span>+ <span>1</span><span>, allFiles.Count);
            Thread.Sleep(</span><span>100</span><span>);
        }
    }
}

}

View Code

本文已独家授权给脚本之家(ID:jb51net)公众号发布

Original: https://www.cnblogs.com/EminemJK/p/10298684.html
Author: 山治先生
Title: Spire高效稳定的.NET组件

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/565077/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球