导航

PDFBox 1.0.0 如何编译成.net能用的dll

Posted on 2010-04-07 09:39  Java_Chu  阅读(1973)  评论(23)    收藏  举报

  最近PDFBox1.0.0发布了,修正了一些bug,这对于一直使用pdfbox的人来讲是个好消息,但是我们不能忘记pdfbox归根到底是java的类库,作为微软阵营的人最头疼的事情一直都是怎么把它转化成能在.net下面托管的dll文件,以前pdfbox0.7.3的时候还没有交给apache基金会,在源代码下面总是附带了.net版本的dll文件,自从0.8.0以后就再也没有看到了,apache的网站上也有些到怎么去编译成dll文件,但是粗粗的几笔实在让人摸不着头脑,经过一个下午的努力,我终于成功的编译出了pdfbox1.0.0版本的dll,在这里和大家分享下.

  首先在 http://pdfbox.apache.org/download.html页面上下载pdfbox1.0.0的源码,编译工具我用的是ant+ikvm,这也是网站上推荐的编译工具,具体的下载地址在http://pdfbox.apache.org/userguide/building_pdfbox.html上,编译之前推荐安装jdk,最新的版本可以自己google,有一点是.net用户感到最头疼的,无论是jdk,ant,ikvm都是需要配置环境变量的,具体如何配置可以google搜索,jdk和Ikvm基本上配置两个键就可以了:Class_path和Path,ant需要配置Ant_home和Java_path,
配置完成以后在命令行里运行"java","ant","ikvm"命令都可以就说明配置正确了.
  接下来就可以开始编译下载下来的源代码了,和.net环境下的编译不同,ant的编译需要在被编译的文件目录下载命令行下输入"ant"指令开始编译,比如说你的源文件在X:\pdf1.0下,则必须使用命令行跳转到 x:pdf> 下ant的编译依赖于文件目录下的build.xml文件,需要编译成dll我们必须制定ikvm的路径,说到底,就是用ant去调用ikvm,在源代码的目录下你可以发现一个build.xml文件,修改其中的段落
<!--.NET properties -->
    <property name="ikvm.dir" value=""/>
    <property name="ikvmc" value="${ikvm.dir}/bin/ikvmc.exe"/>
修改后
    <!--.NET properties -->
    <property name="ikvm.dir" value="X:\\ikvmbin-0.42.0.3\\ikvm-0.42.0.3"/>
    <property name="ikvmc" value="${ikvm.dir}\\bin\\ikvmc.exe"/>
其中X为当前ikvm坐在目录的盘符
修改完成后还需要修改ikvm中的一些引用路径
<exec executable="${ikvmc}">
            <arg value="-reference:${ikvm.dir}/bin/IKVM.OpenJDK.ClassLibrary.dll" />
            <arg value="-reference:${ikvm.dir}/bin/IKVM.AWT.WinForms.dll" />
            <arg value="-target:library" />
            <arg value="-compressresources" />
            <arg value="-out:${bin.dir}\junit.dll" />
            <arg value="${junit.jar}" />
        </exec>
在这种段落中,如果你用的ikvm的版本是0.40以后的,那么记住你需要把<arg value="-reference:${ikvm.dir}/bin/IKVM.OpenJDK.ClassLibrary.dll" />这段去掉
替换成下面这段
<arg value="-reference:${ikvm.dir}\\bin\\IKVM.OpenJDK.Beans.dll" />
<arg value="-reference:${ikvm.dir}\\bin\\IKVM.OpenJDK.Charsets.dll" />
<arg value="-reference:${ikvm.dir}\\bin\\IKVM.OpenJDK.Corba.dll" />
<arg value="-reference:${ikvm.dir}\\bin\\IKVM.OpenJDK.Core.dll" />
<arg value="-reference:${ikvm.dir}\\bin\\IKVM.OpenJDK.Jdbc.dll" />
<arg value="-reference:${ikvm.dir}\\bin\\IKVM.OpenJDK.Management.dll" />
<arg value="-reference:${ikvm.dir}\\bin\\IKVM.OpenJDK.Media.dll" />
<arg value="-reference:${ikvm.dir}\\bin\\IKVM.OpenJDK.Misc.dll" />
<arg value="-reference:${ikvm.dir}\\bin\\IKVM.OpenJDK.Naming.dll" />
<arg value="-reference:${ikvm.dir}\\bin\\IKVM.OpenJDK.Remoting.dll" />
<arg value="-reference:${ikvm.dir}\\bin\\IKVM.OpenJDK.Security.dll" />
<arg value="-reference:${ikvm.dir}\\bin\\IKVM.OpenJDK.SwingAWT.dll" />
<arg value="-reference:${ikvm.dir}\\bin\\IKVM.OpenJDK.Text.dll" />
<arg value="-reference:${ikvm.dir}\\bin\\IKVM.OpenJDK.Util.dll" />
<arg value="-reference:${ikvm.dir}\\bin\\IKVM.OpenJDK.XML.API.dll" />
<arg value="-reference:${ikvm.dir}\\bin\\IKVM.OpenJDK.XML.Bind.dll" />
<arg value="-reference:${ikvm.dir}\\bin\\IKVM.OpenJDK.XML.Crypto.dll" />
<arg value="-reference:${ikvm.dir}\\bin\\IKVM.OpenJDK.XML.Parse.dll" />
<arg value="-reference:${ikvm.dir}\\bin\\IKVM.OpenJDK.XML.RelaxNG.dll" />
<arg value="-reference:${ikvm.dir}\\bin\\IKVM.OpenJDK.XML.Transform.dll" />
<arg value="-reference:${ikvm.dir}\\bin\\IKVM.OpenJDK.XML.WebServices.dll" />
<arg value="-reference:${ikvm.dir}\\bin\\IKVM.OpenJDK.XML.XPath.dll" />
 
原因是0.40以后的版本不在提供IKVM.OpenJDK.ClassLibrary.dll这个文件,而是把它的命名空间进行了拆分,分到了以上这些dll中,如果你不替换的话会一直报错,在命令行中你会看到一推的no reference error
 
到了现在就完成了所有的准备工作,在命令行中运行"ant",就会开始编译,几分钟以后去源文件下面的bin目录下找找吧,你会欣喜的看到pdf-1.0-snapshot.dll这个文件,去替换原来的pdf0.73吧,新的总比旧的好,对吧.
 
PS
新的pdf1.0.0的命名空间有所变化,原来的org变成了apache.org,并且ikvm.rumtime也需要更新一下,当然顺带编译出来的还有font-1.0和jump-1.0