C#中调用PDFCreator生成PDF文件

2023-05-16

前一阵子做了一个生成报表的小project,生成的报表是关于股价的记录。没有什么现成的包和第三方程序给我们用,听说WPF渲染的页面可以之间存成PDF,不过只是道听途说,没敢真正实践,最后还是用了自己以前搞过的方法,Office Interop,在一个word文档中插入很多placeholder搞成template,然后用C#代码动态把PlaceHolder变成数据,然后保存。这个方法其实挺强大,不过有几个限制和不爽的地方。第一,程序运行的机器上要有Office安装,word是必须的,如果要生成图的话,还需要Excel. 第二,.NET Office Interop本质上还是COM的封装,性能和稳定性就不能太苛求了。第三,Office Interop搞起来还是挺烦的。抱怨了半天,不过这个方法还是可行的。不过最后要求生成PDF形式的报表,但是Office没有PDF生成的支持,这怎么办?想起自己每每需要生成PDF文件的时候直接用PDFCreator虚拟打印机就可以了,查了一下,果然,PDFCreator有COM API. 这下问题解决了。

在C#中如何调用PDFCreator生成PDF文件呢?

第一步:安装PDFCreator (这个好像是废话)

第二步:创建C#项目,加入PDFCreator.exe COM引用

第三步:参见如下代码:

public override void Process(ITask task, int index)
        {
            if (!File.Exists(Path.Combine(FromLocation, FromFilename)))
            {
                throw new FileNotFoundException("File: " + Path.Combine(FromLocation, FromFilename) + " does not exists");
            }

            Monitor.Enter(lockObject);

            clsPDFCreator creator = null;

            try
            {
                creator = new clsPDFCreator();
                creator.eError += new __clsPDFCreator_eErrorEventHandler(creator_eError);
                creator.eReady += new __clsPDFCreator_eReadyEventHandler(creator_eReady);
                String paramters = "/NoProcessingAtStartup";

                if (!creator.cStart())
                {
                    throw new Exception("Cannot launch PDFCreator. Error: " + Error);
                }

                var opt = creator.cOptions;
                opt.UseAutosave = 1;
                opt.UseAutosaveDirectory = 1;
                opt.AutosaveDirectory = this.ToLocation;
                opt.AutosaveFormat = 0;
                opt.AutosaveFilename = this.ToFilename;
                creator.cOptions = opt;

                creator.cClearCache();

                creator.cDefaultPrinter = "PDFCreator";

                if (!creator.cIsPrintable(Path.Combine(FromLocation, FromFilename)))
                {
                    throw new Exception("File: " + Path.Combine(FromLocation, FromFilename) + " is not printable.");
                }

                creator.cPrintFile(Path.Combine(FromLocation, FromFilename));
                creator.cPrinterStop = false;

                Ready = false;
                var duration = new TimeSpan(0, 0, 0, TimeoutInSec);

                DateTime lastCheck = DateTime.Now;
                DateTime startTime = lastCheck;
              
                while (!Ready && ((lastCheck - startTime) < duration))
                {
                    System.Threading.Thread.Sleep(500);
                    lastCheck = DateTime.Now;
                }

                creator.cPrinterStop = true;
                Thread.Sleep(1000);
                creator.cClose();

                if (!Ready)
                {
                    throw new Exception("PDF creation failed. This maybe due to timeout.");
                }
            }
            finally
            {
                Monitor.Exit(lockObject);
            }
        }

        void creator_eReady()
        {
            this.Ready = true;
        }

        void creator_eError()
        {
            Error = creator.cError.Description;
        }

代码很好懂,自己很懒,没有把代码重新写成一个Project,直接把Project中的代码贴上了,大家要用的话,还要稍微修改一下。要说的一点是PDFCreator不支持多线程,所以如果程序本身是多线程的话,需要在代码中增加一个锁机制,保证PDF生成的调用是单线程的。还有打印机的名字用的是默认值,没有修改,不过这些问题是难不倒各位看官的。

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

C#中调用PDFCreator生成PDF文件 的相关文章

  • 未找到 EOF 标记 - 如何在 PyPDF 和 PyPDF2 中修复?

    我正在尝试使用 Python 将几个 PDF 文件合并为一个 PDF 文件 我已经尝试过 PyPDF 和 PyPDF2 在某些文件上 它们都抛出相同的错误 PdfReadError 未找到 EOF 标记 这是我的代码 page files
  • 如何使用 MigraDoc 让表情符号出现在生成的 PDF 中

    我正在尝试生成包含一些表情符号的 PDF 但没有成功 为了使其简单且可重现 这里是代码 Document document new Document Section section document AddSection Paragraph
  • 在solr中获取pdf搜索结果的页码

    我正在构建一个 Web 应用程序 用户可以在其中搜索 pdf 文档并使用 pdf js 查看它们 我想显示搜索结果 其中包含找到搜索词的段落的简短片段以及用于在右侧页面打开文档的链接 所以我需要的是每个搜索结果的页码和简短的文本片段 我正在
  • PDF解析提取CheckBox字段值

    我有一个 PDF 文档 想要从 PDF 和 Chackbox 和单选按钮类型字段值中提取内容 PDF 文件的版本为 1 4 Acrobat 5 x 可以从网络浏览器生成 CheckBox appear such types in PDF 我
  • 将 PDF 存储在 MySQL 数据库中

    我正在开发一个应用程序 我需要创建 PDF 格式的发票 我在用着pdf包 https github com psliwa PdfBundle并且 PDF 文件已正确创建 public function helloAction format
  • Python PIL 由于某种原因无法打开 PDF

    所以我的程序能够打开 PNG 但不能打开 PDF 所以我这样做只是为了测试 但它仍然无法打开 甚至是一个简单的 PDF 我不知道为什么 from PIL import Image with Image open r Adams K a pd
  • 在 ionic 中从 Base64 打开 pdf

    因此 我将 Jasper 报告转换为 pdf 然后在 REST 控制器中转换为 base64 我该如何将其传输到我的 ionic 3 应用程序 我研究了 Ionic Native Document Viewer 但为了做到这一点 我需要将文
  • Linux:命令行实用程序将 RTF 转换为 PDF?

    有什么建议可以将 RTF 转换为 PDF 吗 我需要从 LAMP 应用程序执行此操作 因此像 GhostScript 这样的命令行实用程序将是理想的选择 或者 您可以使用 libreoffice 来完成此任务 libreoffice hea
  • 渲染从 SimpleDocTemplate 构建的 ReportLab pdf

    我有一个 django 应用程序 当前使用用户可以下载的画布生成 pdf 我创建一个 StringIO 缓冲区 执行一些操作 然后发送调用 response write Set up response response HttpRespon
  • 如何将嵌入的 ICC 配置文件信息转储为 PDF? (命令行或 GUI 工具)

    它在那里命令行或 GUI 工具转储有关 ICC 配置文件 颜色转换的信息 这些信息是在 Illustrator 的 PDF 导出对话框中设置的 PDF 的颜色管理和 PDF X 选项 选项 Illustrator 的 PDF 颜色管理和 P
  • Grails 渲染 PDF 文件

    我正在尝试在网页中呈现 PDF 文件 但使用以下语法时 我得到了一个奇怪的字符组合 render file new File path to file pdf fileName myPdfFile pdf 有谁知道除了上面的行之外我还需要添
  • 使用 Pyqt4 从 URL 下载数千个 PDF

    理想情况下 我试图从给定网站下载数千个 PDF 然而 由于某种原因 它甚至无法下载 100 个 PDF 我不知道为什么 这是代码 usr bin env python import time from pyPdf import PdfFil
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar
  • 使用 Tabula 通过 Python 读取 pdf 时出现 Java 错误

    我已经安装了 tabula 库 用于使用 python 将 pdf 读取到 pandas 数据框中 但是当我运行代码时 import tabula df tabula read pdf sample1 pdf pages 1 我得到了例外
  • PDF Tj 命令带有尖括号?

    我试图弄清楚在哪里未压缩的PDF v1 4 文档使用 Times 字体 The Font描述 PDF 中 Times 字体的对象是 object65如下 65 0 obj lt Font Subtype TrueType BaseFont
  • LibreOffice 并行将 .docx 转换为 .pdf 效果不佳

    我有很多 docx 文件需要转换为 pdf 将它们一一转换需要很长时间 所以我编写了一个 python 脚本来并行转换它们 from subprocess import Popen import time import os os chdi
  • 使用 PDFbox 从区域中提取文本

    是否可以从一个区域中提取文本PDFbox http pdfbox apache org index html仅使用二进制文件而不必创建自己的代码 编译这个简单的程序并将其打包到 jar 中 import java awt geom Rect
  • 无法使用文件提供程序从内部存储打开 PDF 以便在 Android 8 和 9 上查看

    仅适用于 Android 8 和 9 我这里有一个 PDF 文件管理器 String url file storage emulated 0 Android data com verna poc files Download mypdf p
  • 编码员的 PDF 规范:Adobe 还是 ISO?

    我想编写一个可以读取和解码 pdf 文档的应用程序 现在我应该在哪里获取此文件格式的规格 PDF 格式是由 ISO 组织标准化的 但我不清楚哪里是获取此类信息的最可靠来源 什么是开始使用这种文件格式的好来源 您实际上可以使用您提到的两个来源
  • 如何修复 Laravel 中未找到的“PDF”类

    在我的 Laravel 应用程序中遇到以下错误 CollaboPDFController php 第 14 行中的 FatalErrorException 未找到 PDF 类 这是我的ColaboPDFController php

随机推荐

  • 字符串匹配中KMP算法的next数组构造与思考

    对于KMP算法的next算法 xff0c 匹配规则i不动 xff0c j而是根据 next j 61 k 如果在j位置失配 xff0c 则退到k位置 构造next数组的 是根据前缀与后缀的最长匹配 如ababaa 的next数组是 1001
  • x86_64架构的VINS-fusion-GPU部署

    x86 64架构的VINS fusion GPU部署 1 环境配置 xff08 Ubuntu 18 04 xff09 xff08 0 xff09 CUDA 10 2 安装 由于笔记本的GPU太老 xff08 GeForce 840M xff
  • 字符串匹配的后缀数组的直接比较和利用rank[i]=k的倍增法

    public static Suff getSa String s Suff SuffArrays 61 new Suff s length sa i 61 k表明的排名为i的后缀是从k开始的 for int i 61 0 i lt s l
  • 关于求后缀数组的公共前缀的长度height数组求法思路与代码

    字符串匹配之后缀数组 概念 xff1a 后缀数组 xff1a 是所有后缀按字典排序后 xff0c 数组中记录的起始下标 sa 0 61 5 起始下标为5的后缀 在所有后缀中字典最小 rank数组 xff1a 是给定后缀下标 xff0c 返回
  • Excel 2013 Power Programming with VBA 翻译

    第14 章 xff1a 基于VBA开发的Excel实用工具 545页 是什么让它成为一个优秀的工具 xff1f Excel工具 xff0c 理所应当的让你的工作变得更容易或者更有效 但是 如果你正在为其他用户开发一个实用工具 xff0c 你
  • 回首13我们奋斗在14的路上

    xfeff xfeff 晓松老师说 xff1a 2013世界依旧很大 xff0c 大到可以晓说 的确 xff0c 猛然间的细数2013的点点滴滴 xff0c 发现它还可以 大到我们去回味 2013的我也失败过 xff0c 学习过 xff0c
  • myeclipse中编写小java项目遇到的一些问题(持续更新)

    刚开始学习java程序 xff0c 读了 lt lt thingking in java gt gt 刚开始编写正常 xff0c 可后来再次打开时看到所创建的java项目都会出现红色叉号 后来搜了一会儿却还是什么感觉很乱 xff0c 最好也
  • IT成长录

    少壮不努力 xff0c 老大学IT xff0c 初次听到这句话是我大学老师在一次上课时看到满班乱哄哄的气氛说的 xff0c 当时以为他是嘲讽我们或者是略微自嘲呢 xff0c 现在回想起来有些不一样的感觉 从自己第一份接触IT工作 xff08
  • 我所了解的大数据

    大数据如今越来越热 xff0c 数据量再大不会用 xff0c 放到那里也是存储垃圾 所以随着数据量的越来越大 xff0c 对数据的各种处理和挖掘需求也很多 这就促进分布式存储和计算软件的快速发展 xff0c 集群的规模也越来越大 从以前的某
  • 通过Jetty搭建一个简单的Servlet运行环境

    最近在做一些简单的Servlet开发的时候 感觉每次调试的时候都要发布到tomcat上很麻烦 把程序共享给同事也很麻烦 需要帮他设置本地的tomcat环境 在网上找了找其他的Servlet运行环境 发现用Jetty可以很方便的实现嵌入式We
  • 一些常用的Maven Plugin配置

    Maven是一个常用的Java build Manager 使用Maven可以很好的对Java Project的dependency进行管理 这里我记录几个比较常用的Plugin配置 生成JAR打包文件 lt plugin gt lt gr
  • 在Java项目中整合Scala

    Scala是一个运行在Java JVM上的面向对象的语言 它支持函数编程 xff0c 在语法上比Java更加灵活 xff0c 同时通过Akka库 xff0c Scala支持强大的基于Actor的多线程编程 具有这些优势 xff0c 使得我最
  • dubbo好书推荐

    为了自己的进步 xff0c 也为了能够帮助其他人 xff0c 我决定开始写一些东西 xff0c 网上有很多学习资料 xff0c 自己的功力未必到家 xff0c 所以大家共同进步吧 xff01 站在巨人的肩膀上看得远 xff0c 现在推荐一本
  • 2013年终总结

    又到12月份了 天黑得早了 还是一如既往得冷 每天闹钟响起看着窗外黑通通的天 都有一种很不情愿的感觉 还好已经年底了 今年的工作已经接近尾声 可以放松一下 每天虽然人坐在办公室 但一半的时间是用来醒酒 而另一半时间则是和同事讨论晚上去哪里喝
  • 小议企业开发部门的分工与合作

    周五帮以前部门的同事查一个测试环境的权限错误的问题 一个用户在系统里的权限设置 xff0c 一切很正常 但是从中间层的权限检查老报错 虽然这个系统的权限检查部分是我一年多以前做的 xff0c 而我已经换到另外一个部门有一段时间了 xff0c
  • 语言之争

    Java和 Net选哪个 xff1f 这是每一个菜鸟都必须要面对的问题 Java 可能是大多数程序员学习的第一个面向对象的编程语言 它最大的优势就是跨平台性 其实 xff0c 在国内小型机当道的时代 xff0c Java 是唯一可以选择的开
  • Oracle数据库小白使用记 -- 通过存储过程提取数据

    本人是Oracle数据库小白 xff0c 一直都是用Sql Server的 xff0c 最近到被安排到一个项目去救火 这个项目使用的Java和Oracle数据库的组合 xff0c 没办法 xff0c 一切要从头学起 其实这个项目本身并不是很
  • 分享一个简单的Tomcat本地开发脚本

    最近在搞java web service xff0c 一开始开发的时候都是用Maven集成Jetty来运行 xff0c 感觉很方便 但是 xff0c 当需要一次运行多个war的时候就显得力不从心了 同时 xff0c
  • 我和Java 8的第一次亲密接触

    周五上班偶然发现单位的系统里有Java 8可以用了 xff0c 周六无事 xff0c 把自己现在在做的一个项目从Java 1 6升级到了1 8 过程并不是一番风顺 xff0c 在此记录 xff0c 希望可以对各位看客有所帮助 先说说现在在做
  • C#中调用PDFCreator生成PDF文件

    前一阵子做了一个生成报表的小project xff0c 生成的报表是关于股价的记录 没有什么现成的包和第三方程序给我们用 xff0c 听说WPF渲染的页面可以之间存成PDF xff0c 不过只是道听途说 xff0c 没敢真正实践 xff0c