.Net C# 免费PDF合成软件

2023-10-29

最近用到pdf合成,发现各种软件均收费啊,这个技术非常简单,别人写好的库一大把,这里用到了PDFsharp,项目地址Home of PDFsharp and MigraDoc Foundation

软件下载地址

https://download.csdn.net/download/g313105910/88014569

源码下载地址

https://download.csdn.net/download/g313105910/88014573

废话不多说,上WPF代码

<Window x:Class="mergePDF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:mergePDF"
        mc:Ignorable="d"
        Title="PDF合成器,有顺序要求请用数字给文件命名,从小到大排序" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="10*"/>
            <RowDefinition Height="33*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Button Content="合成" HorizontalAlignment="Left" Margin="737,0,0,0" VerticalAlignment="Center" Click="ButtonStart_Click" Height="19" Width="28"/>
        <Button Content="选择目录" HorizontalAlignment="Left" Margin="675,0,0,0" VerticalAlignment="Center" Click="ButtonUrl_Click" Height="19" Width="52"/>
        <TextBox x:Name="Url_Text" HorizontalAlignment="Left" Margin="60,0,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Center" Width="600" Height="17"/>
        <Label Content="Url:" HorizontalAlignment="Left" Margin="25,0,0,0" VerticalAlignment="Center"/>
        <TextBox x:Name="Info_Text" TextWrapping="Wrap" VerticalScrollBarVisibility="Visible"  Text="" Grid.Row="1"/>
    </Grid>
</Window>
using FolderBrowserEx;
using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;
using System;
using System.Collections.Generic;
using System.IO;
using System.Windows;

namespace mergePDF
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void ButtonStart_Click(object sender, RoutedEventArgs e)
        {
            Info_Text.Text = string.Empty;
            CombinePdfFiles(Url_Text.Text);
        }

        public void CombinePdfFiles(string folderPath)
        {
            try
            {
                //读取文件夹中的文件夹
                int fileCount = 0;
                int pageCount = 0;
                PdfDocument outPdfFile = new PdfDocument();
                List<string> fileNameList = new List<string>();
                List<string> fileError = new List<string>();
                fileNameList.Add("开始合并");
                foreach (var filename in Directory.GetFiles(folderPath))
                {
                    if (System.IO.Path.GetExtension(filename) == ".pdf")
                    {
                        try
                        {
                            PdfDocument pdfFile = PdfReader.Open(filename, PdfDocumentOpenMode.Import);
                            fileCount++;
                            pageCount += pdfFile.PageCount;
                            int pageIndex = 0;
                            foreach (var pdfPage in pdfFile.Pages)
                            {
                                outPdfFile.AddPage(pdfPage);
                                pageIndex++;
                                fileNameList.Add(string.Format("文件名:{0}\t\t\t\t第{1}页\t文件共有{2}页", System.IO.Path.GetFileName(filename), pageIndex, pdfFile.PageCount));
                            }
                        }
                        catch (Exception ex)
                        {
                            fileError.Add(System.IO.Path.GetFileName(filename));
                            Info_Text.Text += ex.Message + "\r\n";
                        }
                    }
                }
                string combineResult = "";
                if (fileCount > 0)
                {
                    //导出pdf文件
                    string timeTag = DateTime.Now.ToString("MMdd_HH_mm_ss");
                    SavePdfFile(folderPath + "\\合并", timeTag + ".pdf", outPdfFile);
                    fileNameList.Add(string.Format("共 {0} 个文件,共 {1} 页。", fileCount, pageCount));
                    if (fileError.Count > 0)
                    {
                        fileNameList.Add("合并失败文件:");
                        foreach (string p in fileError)
                        {
                            fileNameList.Add(p);
                        }
                    }
                    SaveTxtFile(folderPath + "\\合并", timeTag + ".txt", fileNameList);
                }
                combineResult = string.Format("合并成功文件数量:{0}", fileCount);
                if (fileError.Count > 0)
                {
                    combineResult += "\r\n";
                    combineResult += string.Format("合并失败文件数量:{0}", fileError.Count);
                }
                foreach(var str in fileNameList)
                {
                    Info_Text.Text += str + "\r\n"; ;
                }
                Info_Text.Text += combineResult + "\r\n"; 
            }
            catch (Exception ex)
            {
                Info_Text.Text+=ex.Message + "\r\n";
            }
            Info_Text.ScrollToEnd();
        }
        private void SavePdfFile(string folderPath, string fileName, PdfDocument pdfFile)
        {
            if (!Directory.Exists(folderPath))
            {
                Directory.CreateDirectory(folderPath);
            }
            pdfFile.Save(folderPath + "\\" + fileName);
        }
        private void SaveTxtFile(string folderPath, string fileName, List<string> content)
        {
            if (!Directory.Exists(folderPath))
            {
                Directory.CreateDirectory(folderPath);
            }
            string fileFullPath = folderPath + "\\" + fileName;
            if (!File.Exists(fileFullPath))
            {
                var newFile = File.CreateText(fileFullPath);
                newFile.Close();
            }
            using (StreamWriter sw = new StreamWriter(fileFullPath, true))
            {
                foreach (string line in content)
                {
                    sw.WriteLine(line);
                }
                sw.Close();
            }
        }

        private void ButtonUrl_Click(object sender, RoutedEventArgs e)
        {
            FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
            folderBrowserDialog.Title = "Select a folder";
            //folderBrowserDialog.InitialFolder = @"C:\";
            folderBrowserDialog.AllowMultiSelect = false;
            if (folderBrowserDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                Url_Text.Text = folderBrowserDialog.SelectedFolder;
            }
        }
    }
}

使用方法->打开软件

选择目录

合成成功

合并后的文件和日志

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.Net C# 免费PDF合成软件 的相关文章

  • C# 3.0 使用MemoryStream将itextsharp pdf保存到数据库

    我正在尝试将 itextsharp 生成的 pdf 文件保存到数据库 但是 到目前为止我还没有成功 我正在使用 Linq to sql 这是代码 MemoryStream ms new MemoryStream Document d new
  • 如何以编程方式生成在图像顶部带有标签的维恩图图像?

    我正在尝试为 pdf 报告生成维恩图 其中文本位于不同区域的顶部 我们使用 htmldoc 生成 pdf 这会排除背景图像之上的文本 我们使用谷歌图表 API 来处理其他图像 但他们的维恩图不支持图表顶部的文本 据我所知 最简单的路径是使用
  • Zend 框架 PDF 问题

    又是我 伙计们 我有一个小问题 Create new PDF pdf new Zend Pdf Add new page to the document page pdf gt newPage Zend Pdf Page SIZE A4 p
  • 主目录 不允许下载媒体

    尝试将 PDF 文件保存在下载目录中 但之后getExternalStoragePublicDirectory在 Android Q 后完全弃用 无法将文件保存在 DCIM 或 Pictures 文件夹之外的任何其他位置 因为尝试在此处保存
  • 使用 Quartz 创建 PDF 注释 (iOS)

    有人设法使用 Quartz 在现有 PDF 中编写自定义注释吗 我已经使用 CGPDFDocumentRef 等渲染了 PDF 现在工作正常 我成功地阅读了 Annots 字典 if CGPDFDictionaryGetArray page
  • 是否可以修改 PDF 表单字段名称?

    情况是这样的 我有一个 PDF 其中包含自动生成的 pdf 表单字段名称 问题是这些名称不太用户友好 它们看起来像 topmostSubform 0 Page1 0 Website Address 0 我希望能够更改它们 使它们类似于 We
  • 无法使用文件提供程序从内部存储打开 PDF 以便在 Android 8 和 9 上查看

    仅适用于 Android 8 和 9 我这里有一个 PDF 文件管理器 String url file storage emulated 0 Android data com verna poc files Download mypdf p
  • 如何将目录及其子目录中的所有 PDF 文件复制到一个位置?

    如何全部复制PDF文件从目录及其子目录到单个目录 实际上还有更多的文件 并且深度有些任意 假设四个目录的最大深度是公平的 我想这些文件需要重命名 如果a pdf例如 位于多个目录中 因为我会adding https ebooks stack
  • 如何在无头模式下使用 Libre Office Draw 从命令行创建 PDF/A?

    LibreOffice Draw 允许您打开非 PDF A 文件并将其导出为 PDF A 1b 或 PDF A 2b 文件 通过在 macOS 上调用命令行也可以实现相同的效果 Applications LibreOffice app Co
  • 如何从 pdf C# 中获取具有特定颜色的文本

    我必须将 pdf 文件中的数据放入特定的数据库结构中 这要求我能够从 pdf 文件中获取某些数据 由于 pdf 没有任何标签等 我想知道是否可以根据颜色获取文本 比如说我想要所有的红色文本 或者我想要文档中的所有斜体文本 这在 C 中可能吗
  • 在应用程序服务器上存储 PDF 一段有限的时间并可供下载

    您好 我正在使用 PrimeFaces 5 JSF 2 和 tomcat 有人可以向我展示或给我一个关于如何在应用程序服务器上在有限时间内存储 pdf 的想法吗 我正在使用 tomcat 然后下载它 如果这是用户请求的 此功能与发票相关 因
  • 在 JSPdf 中嵌入二进制文件

    我在用着JsPDF https www npmjs com package jspdf将 html 内容导出到下载的 PDF 考虑以下示例 该示例获取一些 HTML 内容并将其输出到下载的 PDF 文件 使用JsPdf import Rea
  • PyFPDF在指定大小时无法添加页面

    在 pyfpdf 文档上据说可以在添加页面时指定格式 fpdf add page orientation format same False 但在指定格式时它给了我一个错误 error pdf add page format 1000 10
  • 邪恶的pdf在两页上渲染最后一行

    我在用邪恶 pdf https github com mileszs wicked pdf生成 pdf 我面临的问题是 有时它会跨两页显示页面中的最后一行 如果 wicked pdf 无法容纳该页面中的整个行 或者对页面中的行数设置限制 有
  • FileReader 读取 PDF 时丢失数据

    我的限制是只能以 JSON 格式将数据发送到服务器 并且我需要将 PDF 文件与 JSON 中的其他表单数据一起发送 我虽然可以用 base64 从中创建一个字符串 如下所示这个解决方案 https stackoverflow com a
  • 使用itext java库复制时pdf文件大小大大增加

    我正在尝试使用 Java 中的 itextpdf 库将现有的 pdf 文件复制到一些新文件中 我使用的是 itextpdf 5 5 10 版本 我在两种方式上都面临着不同的问题 PDFStamper 和 PdfCopy 当我使用 PDFSt
  • Wkhtmltopdf 每页右侧的垂直文本

    下面是使用 wkhtmltopdf 生成的 PDF 示例 我需要在每一页的右书脊上生成文本 我尝试将其添加到标题代码中 似乎会剪辑 PDF 的正文 我正在使用 wkhtmltopdf 的页眉和页脚参数 不太确定如何或是否可以在每个页面的右侧
  • 如何使用itext7缩放固定矩形内的文本?

    我正在尝试使用 c 中的 itext7 制作一个 pdf 文档 该文档应该具有包含不同文本的固定矩形 这些文本应该在 不可见 矩形的边界内缩放 我试图寻找是否有自动缩放功能 但到目前为止只发现表单域的自动缩放功能 由于 pdf 将用于绘制文
  • 通过 PDFBox 访问图像的“替代文本”

    有没有某种方法可以使用提取特定图像的 替代文本 PDFBox http pdfbox apache org 我有一个 PDF 文件 如所述http www w3 org WAI GL 2011 WD WCAG20 TECHS 2011062
  • 无法在 MARSHAMALLOW 文件选择器中选择 pdf、doc、ppt 等文件

    我正在使用我的 Android 应用程序将 pdf ppt doc 等文件上传到服务器 但在 Marshmallow 中 当文件选择器打开并且我浏览我的 Sdcard 或内部存储时 存在两个问题 1 它显示了所有我无法选择的文件 例如图像

随机推荐

  • 软件工程中如何设计测试用例

    黑盒测试用例 将程序看做一个黑盒子 只知道输入输出 不知道内部代码 由此设计出测试用例 分为下面几类 等价类划分 把所有的数据按照某种特性进行归类 而后在每类的数据里选取一个即可 等价类测试用例的设计原则 设计一个新的测试用例 使其尽可能多
  • @Linux搭建LDAP认证服务

    文章目录 1 Ldap概述 2 Ldap的用途 3 Ldap的数据模型 1 数据模型叙述 2 目录树简述 3 Ldap目录树说明 2 搭建LDAP服务器 1 环境准备 2 Ldap服务搭建 3 Ldap Web UI安装 1 安装PHPLD
  • Git 推送本地分支至远程分支

    总结一 本地创建本地分支并切换 针对当前cas thymeleaf 创建一个cas 分支 Administrator PC 20180603XCNG MINGW64 d git workspace cas thymeleaf main gi
  • CSDN的常用技巧(字体、颜色、大小、类型、背景标记、删除、居中)

    CSDN的常用文本设置 字体 颜色 大小 类型等 一 字体设置 二 绘制表格 三 下划线 四 首行缩进 五 设置插入图片的大小 六 空格 七 黑点 八 背景标记 删除文本 九 文字居中 一 字体设置 CSDN Markdown编辑器对字体设
  • 前端 注册界面开发

    1 div的使用 我所理解的div标签类似于ps中的图层一样 当我需要在页面展示内容时候 只需要在图层中添加相关的信息 下面通过此界面的创建过程讲解有关div的使用 添加总体的div div style width 200px height
  • 【PythonWeb】Flask(微框架) + jinja2(模板)

    Hello world conda create n flaskvir python 3 8 conda activate flaskvir flaskvir PS C Users hp gt conda env list conda en
  • 【unity】VS没有代码补全问题

    1 运行Visual Studio Installer 安装插件 2 打开unity项目 进入Package Manager 安装插件 3 打开Preferences窗口 修改External Scripts Editor为你的vs编辑器
  • 非华为电脑与华为平板、手机(鸿蒙系统)之间实现多屏协同功能

    前言 电脑型号 联想拯救者r7000p 2020 平板 huawei matepad11 手机 荣耀v20 安装软件 华为电脑管家11 1 1 95 参考 文章教程 https www coolapk com feed 27435645 s
  • 有 1000 瓶药物,但是其中有一瓶是有毒的,小白鼠吃了一个星期以后就会死掉!请问,在一个星期内找出有毒的 药物,最少需要多少只小白鼠?

    天堂之鼠 文章目录 天堂之鼠 原题题目 某个面试题 有 1000 个一模一样的瓶子 其中有 999 瓶是普通的水 有一瓶是毒药 任何喝下毒药的生物都会在一星期之后死亡 现在 你只有 10 只小白鼠和一星期的时间 如何检验出哪个瓶子里有毒药
  • linux中;、&和&&、

    Linux 特殊字符用法 特殊字符 注意 shell 在执行某个命令的时候 会返回一个返回值 该返回值保存到 shell 变量 如果 0时 表示命令执行成功 如果 1时 有时可以认为非0的数 返回值在0 255 之间 表示命令执行失败 分号
  • 以太坊学习:第一天

    目录 区块链目前可以分为四类 公链 私链 联盟链以及侧链 公链 私链 权利掌握在少数人手里 联盟链 部分去中心化 侧链 拓展协议 参考资料 以太坊的组成部分 以太坊中的重要概念 以太坊的货币 以太坊的挖矿产出 以太坊区块收入 区块链相关网站
  • JavaScript——中断请求的几种方案

    1 Promise Promise有一个缺点是一旦创建无法取消 所以本质上Promise是无法被终止的 但是我们可以通过中断调用链或中断Promise来模拟请求的中断 中断调用链 中断调用链就是在某一个then catch执行之后 后续的链
  • 期货开户交易绝对相信自己

    但当有些人不再害怕时 他们倾向于轻率 冲动鲁莽 轻率的结果就是他们又开始害怕了 如果你害怕犯错 你的恐惧会让你对市场的理解产生错误 导致你犯错 你无法学到足够的知识以弥补恐惧造成的消极影响 你就不会客观 不会毫不犹豫地行动 换句话说 在持续
  • 乘积尾零 蓝桥杯

    题目描述 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 如下的 10 行数据 每行有 10 个整数 请你求出它们的乘积的末尾有多少个零 5650 4542 3554 473 946 4114 3871 9073 9
  • Rhythmbox中文乱码解决办法

    转自 http hi baidu com morgensonne item 3470aef58747abde6325d2d9 今天在网络上找到了一个比较好的解决Rhythmbox中文乱码的问题的方法 进入你的音乐文件夹执行如下代码 mid3
  • vue3项目(七)----Login

    1 登录 整体认识和路由配置 2 登录 表单校验实现 ElementPlus表单组件内置了表单校验功能 只需要按照组件要求配置必要参数即可 思想 当功能很复杂时 通过多个组件各自负责某个小功能 再组合成一个大功能是组件设计中的常用方法 表单
  • 使用vue-cli创建一个vue3项目

    1 安装脚手架vue cli 如果之前已经安装过vue cli 先查看版本 保证vue cli版本在4 5 0以上 vue V 如果版本低于4 5 0 执行以下命令升级 npm install g vue cli 安装过程中有可能会出现报错
  • 大疆TT无人机编程初体验,教你对拥抱开源的无人机为所欲为!

    先放个项目演示视频镇帖 可能是大疆TT无人机的第一款DIY遥控器 大疆TT无人机编程试飞初体验 认识我的朋友 大概都知道 我是一个 运气爆棚 的人 经常能 捡 到一些好玩的东西 这不 前两天在家门口 捡 到一架大疆 RoboMaster T
  • 有15个人围成一圈,顺序排号。从第一个人开始报数(从1~3报数),凡报到3的人退出圈子,问最后留下的人 C#版

    今天下午 某一同学 问我一面试题 第一做法就是度娘了半天 发现都是c c 的 遂参考逻辑 整理完一C 版本的 留个小纪念 绝对正宗C namespace ConsoleApplication1 class Program static vo
  • .Net C# 免费PDF合成软件

    最近用到pdf合成 发现各种软件均收费啊 这个技术非常简单 别人写好的库一大把 这里用到了PDFsharp 项目地址Home of PDFsharp and MigraDoc Foundation 软件下载地址 https download