PDF文件格式几乎是所有开发平台或者业务系统都热爱的一种文档格式。

目前有很多优秀的开源PDF组件和类库。主要平时是使用.NET和Java开发,所以比较偏好使用iText,当然,它本身就很强大。iTextSharp是一个用来生成PDF文档的C#组件,相当于Java版的iText。iTextSharp可以运行在Windows操作系统中,由C#语言开发,授权协议是AGPL。其官方网站为 http://itextpdf.com/

关于iText(iTextSharp)的使用,有机会再跟大家一起分享一下。这里主要记述一次修复iTextSharp-5.2.1版本的一个小bug。

一件很小的事情

事情很简单,在一次政府项目中有需要对PDF格式的附件进行操作。由于有着iText的使用经验,自然首选了iTextSharp作为文件读写操作的中间件。正如众多故事的开始,系统一直正常运行着,一切都很正常。直到有一天,客户反应他们的附件无法正常操作,团队的成员先是简单测试后,没发现问题;但是,就是客户发来的附件确实无法正常操作。经过排查,排除了客户文件加密或者版式等问题,只有一点:附件相对通常用户的附件大了不少!将近百兆。好吧,开发人员反馈回来,估计是iTextSharp本身的bug问题吧o(︶︿︶)o

首先想到的就是,是不是内存溢出了?(为什么这是第一反应)没办法,只有开扒源码了,还好,它是开源的,我们可以尝试去修改源码。OMG~万能的source code,绝对是所有开发人员的最终挚爱。

从官网下载源码之后,用VS2010打开项目工程itextsharp,

很快,定位到如下路径(~\itextsharp-dll\itextsharp-src-core-5.2.1\iTextSharp\text\pdf\ByteBuffer.cs)

仔细查看后,发现确实有个很明显的失误,果断加入如下代码:

        /**
* Appends a string representation of a <CODE>long</CODE> according
* to the Pdf conventions.
* @param i the <CODE>long</CODE> to be appended
* @return a reference to this <CODE>ByteBuffer</CODE> object
*/
public ByteBuffer Append(long i)
{
return Append((double)i);
}

兴奋的重新编译,生成,替换引用,一气呵成!  然后几经测试,终于成功了。

也许在各位看来这是一个如此简单的问题,能叫修复吗?能算有成就感吗?确实,这段代码不足为奇,甚至简单到不能再简单。然而,它确实起效了!解决问题了。限于篇幅,在此就不再深究,也不反复推敲,有兴趣的可以去刨源码,或者另作讨论。

那么问题来了,这般博尔特式的百米冲刺,快刀斩乱麻,甚至“不讲道理”,下面的就是题外话了。

那你想说什么呢?

那么我到底想说什么呢?总的来说,由这件事想到了几点,权且作为一次007mm的进步~

权且抛砖引玉了,只言片语:

1、关于开发:每个开发人员的时间都是及其宝贵的,我们要做的是在有效的时间内创造有效的价值;但是我们是否应该在开发是更专注一些,能够考虑到的方面更全面一些,一个如此成熟优秀的开源软件,同样也存在着如此微小的错误。我们更因共同勉之励之。

以前听说微软的开发小组将错误分成以下4个等级。一级严重:错误导致软件崩溃。二级严重:错误导致一个特性不能运行并且没有替代方案。三级严重:错误导致一个特性不能运行但有替代方案。四级严重:错误是表面化的或是微小的。或许在快速迭代开发或者是软件开发初期是一个有效的记录分析手段,利于重点着手处理;但到软件发布时,错误不应该有等级之分。也就是说,所有的错误都是严重的,应该引起足够的重视不存在微不足道的小错误。只有这样才能不断的减少犯错。

2、关于测试:本人从不善于测试,只是单纯认为:测试的重点在于功能,而决定性在于边界。主要包括数据结构的边界、状态变换的限制及功能的界限。

3、关于问题解决:一直以来围绕着如何解决问题都有着不休的争论,首先声名:笔者绝对不是在这里和稀泥,张家李家还有隔壁老王家确实一个个的都是各有各理。本人一直追求所谓的实效主义,实用、有效是是手段,解决问题是目标。

记得有位牛人也是伟人——弗拉基米尔·伊里奇·乌里扬诺夫(好像也叫 列宁 o(∩_∩)o )说过:目的决定手段。在能够简单解决问题时,把BUG修复一定是开发人员的默认首选项。至于问题探索和总结,那是之后的事情了(请原谅我的囫囵吞枣、不求甚解babala功利主义)。但作为共识的程序员,我们的优质特点就是精益求精,之后个人升级进阶的事情自然就是顺理成章。

如果园友有好的建议和想法,欢迎留下您的足迹讨论

最后推荐一本大家应该都看过、甚至都推荐过的美国著名数学家和数学教育家G▪波利亚所写的名著《怎样解题》
How to Solve It : A New Aspect of Mathematical Method, George Polya

全书的精华是【怎样解题表】,图表中的四大步骤:“理解问题”、“拟定计划”、“实现计划”和“回顾反思”绝对是精华中的极致精品;后面附带作者总结的的探索小词典更是诸多有效的实用的技能手段,总计67个条目堪称解题神器。

itextsharp-5.2.1-修正无法签名大文件问题的更多相关文章

  1. 一些代码 II (ConfigParser、创建大文件的技巧、__getattr__和__getattribute__、docstring和装饰器、抽象方法)

    1. ConfigParser format.conf [DEFAULT] conn_str = %(dbn)s://%(user)s:%(pw)s@%(host)s:%(port)s/%(db)s ...

  2. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  3. 【原创】MVC +WebUploader 实现分片上传大文件

    大文件的上传是我一直以来想学习的一个技术点,今天在项目闲暇之时,终于有机会自己尝试了一把,本文仅仅是个Demo,各种错误处理都么有,仅限于大家来学习思路. 参考博文:http://www.cnblog ...

  4. Java实现FTP批量大文件上传下载篇1

    本文介绍了在Java中,如何使用Java现有的可用的库来编写FTP客户端代码,并开发成Applet控件,做成基于Web的批量.大文件的上传下载控件.文章在比较了一系列FTP客户库的基础上,就其中一个比 ...

  5. HTML上传文件支持大文件上传,下载

    上传 1.修改配置文件web.config,在<system.webServer>下面加入 <security> <requestFiltering > <r ...

  6. C基础 大文件读取通过标准库

    引言 - 问题的构建 C大部分读取文件的时候采用fgetc, 最近在使用过程中发现性能不是很理想.都懂得fgetc每次只能读取一个字符, IO操作太频繁. 所以性能低. 本文希望通过标准库函数frea ...

  7. 大文件传输 分片上传 上传id 分片号 授权给第三方上传

    https://www.zhihu.com/question/39593108 作者:ZeroOne链接:https://www.zhihu.com/question/39593108/answer/ ...

  8. 记一次使用commit提交大文件无法推送到远程库解决问题过程及git rebase使用

    记一次使用commit提交大文件无法推送到远程库解决问题过程及git rebase使用 目录 大文件无法push到远程仓库 问题 commit的大文件无法push到远程库解决办法 git filter ...

  9. PHP搭建大文件切割分块上传功能

    背景 在网站开发中,文件上传是很常见的一个功能.相信很多人都会遇到这种情况,想传一个文件上去,然后网页提示"该文件过大".因为一般情况下,我们都需要对上传的文件大小做限制,防止出现 ...

随机推荐

  1. poj1088滑雪最短路径

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 97281   Accepted: 36886 Description ...

  2. Unity 5着色器系统代码介绍(上)

    http://forum.china.unity3d.com/thread-25724-1-10.html Unity 5着色器系统代码介绍(上) Unity在着色器开发方面提供了很大的灵活性.有些工 ...

  3. bzoj 2535: [Noi2010]Plane 航空管制2【拓扑排序+堆】

    有个容易混的概念就是第一问的答案不是k[i]字典序最小即可,是要求k[i]大的尽量靠后,因为这里前面选的时候是对后面有影响的(比如两条链a->b c->d,ka=4,kb=2,kc=3,k ...

  4. 关于通过angularJs将页面中的html table 导出生成excel

    直接上代码: <button class="btn btn-link" ng-click="exportToExcel('#table1')"> & ...

  5. codevs1245 最小的N个和

    1245 最小的N个和 题目描述 Description 有两个长度为 N 的序列 A 和 B,在 A 和 B 中各任取一个数可以得到 N^2 个和,求这N^2 个和中最小的 N个.

  6. CentOS 7 部署 nginx-1.14.2

    参考:http://www.linuxe.cn/post-168.html 链接:https://pan.baidu.com/s/1NzHIY7mYgHJ6yMF_rdd0ZQ 提取码:n8o9 下载 ...

  7. JS高级学习历程-11

    [继承] 在php,一个类去继承另一个类,本类实例化出来的对象,既可以调用本身类的成员,也可以调用父类的成员. 在javascript继承主要通过原型实现,构造函数继承一个对象,构造函数的实例会拥有被 ...

  8. 集合之ArrayList,HashSet,HashMap

    结合框架的体系结构: 一.List(列表) 1. List的特点 (1)List是元素有序并且可以重复的集合,称为序列 (2)List可以精确的控制每个元素的插入位置,或删除某个位置的元素 (3)Li ...

  9. [Leetcode]003. Longest Substring Without Repeating Characters

    https://leetcode.com/problems/longest-substring-without-repeating-characters/ public class Solution ...

  10. HDU - 3966-Aragorn' Story(树链剖分+线段树)

    链接:https://vjudge.net/problem/HDU-3966 题意: Our protagonist is the handsome human prince Aragorn come ...