最近因为私事需要提交护照扫描照片,但是护照扫描之后是pdf格式,而办事的网站需要提交图片格式的护照,所以就涉及到一个把pdf转成图片的问题。

在网上搜索了一下,有很多在线把pdf转图片的网站。可是,我要转的是个人护照,不想上传到别人的网站。

也有一些可以软件可以做本地转换,可惜都不是免费的。

所以我有了自己写一款的打算。

做了一些基本的research,发现要开发处理pdf类型文件的程序,都需要用一个叫GhostScript的软件库,很难绕开。而一旦用了这个软件库呢,后面的工作又会变得非常简单。

虽然我也不是很信任这些"软件库",但是自己又不懂pdf文件的格式,感觉研究清楚这个就得好长一段路。那不如信他一次,直接站在巨人的肩膀上吧。好歹这个软件库的安装文件是数字签名过的(Artifex Software, Inc)。真要有后门,这么多人用,应该已经有人找他们巨额索赔了吧。

用了这个库,开发一款把pdf转换成图片格式的软件真是易如反掌。更准确的说,开发软件的时间比装这个GhostScript的时间还短。

开发我需要的软件过程如下:

第一步,安装GhostScript。下载网址https://www.ghostscript.com/download/gsdnld.html

gswebsite

如上图,点击下载那个Ghostscript 9.26 for Windows (32 bit)的免费版。

双击安装,一路Next,Install,Finish下去就可以。但其实,如果你愿意仔细研读一下他的授权条例的话,也不妨花时间去看一下。我看了之后的总结就是,如果你想把它的任何东西用到你的软件里面,或者你的为别人公开提供服务的网站(比如网上那些提供pdf转图片服务的)里面,你必须开源。

GPL就是这样的。我很想基于它开发一款免费的pdf转图片的软件(因为对绝大多数人来说,为转换一个比较隐私不愿在线转换的pdf付钱实在是太奢侈了……)。但是为此遵循GPL协议的条件就是必须开源。好吧好吧,开就开吧,反正代码写得烂估计也没人愿意看。

c1

c2

c3

c4

c5

GhostScript库安装完成,下面开始开发软件:

第一步,打开Visual Studio:

vsstartup

第二步,创建新的Windows Console Application Project:

createapplication

第三步,安装GhostScript.NET nuget package:

addnugetpackages
installgsnet

第四步,拷贝如下代码过去:

using System; using System.Drawing.Imaging; using System.IO; using System.Reflection; using Ghostscript.NET.Rasterizer; namespace Pdf2Image { class Program { static void Main(string[] args) { var exeLocation = Assembly.GetEntryAssembly().Location; var exeFolder = Path.GetDirectoryName(exeLocation); // Get all the PDF files in the same folder as the exe var pdfFiles = Directory.GetFiles(exeFolder, "*.pdf"); var xDpi = 100; // Set the x DPI var yDpi = 100; // Set the y DPI var pageNumber = 1; // The pages in a PDF document // Create an instance for GhostscriptRasterizer using (var rasterizer = new GhostscriptRasterizer()) { // Process each PDF file foreach (var pdfFile in pdfFiles) { var fileName = Path.GetFileNameWithoutExtension(pdfFile); var outputImagePath = Path.Combine(exeFolder, string.Format("{0}.jpg", fileName)); // Opens the PDF file for rasterizing rasterizer.Open(pdfFile); // Converts the PDF pages to images var pdf2Image = rasterizer.GetPage(xDpi, yDpi, pageNumber); // Save the images pdf2Image.Save(outputImagePath, ImageFormat.Jpeg); Console.WriteLine("Saved " + outputImagePath); } } } } }

第五步,编译,完成!

build

运行方式很简单,将你要转换的pdf放到该程序的同目录下面,双击该程序,然后pdf就会被转成jpeg格式的图片了。

convert

这个只是最简单版的程序,只能转成jpeg格式。改天有空我来写个更User-friendly的带GUI的pdf转图片程序,加一些新功能比如可以自己选择原文件和目标文件地址,可以选择目标图片的格式,供大家下载使用。(当然,还得发布源代码……)

希望这篇文章可以帮助到那些想把pdf转成图片,不相信那些在线网站,又不愿意为此专门花钱买软件的人。

小沐

阿沐公司创始人之一,曾在微软Redmond工作五年,喜欢钻研各种软件相关技术。最擅长的是系统设计和Windows编程,最不擅长的是编译器和人工智能。不过最近正在学习人工智能。