2005年07月26日

PDFSELECT1.1

Usage: pdfselect [options] infile [outfile]
Options:
-p N, –pages N         Intervals of pages to be selected,if N=0 ,the inFile wil
l be split to many one page pdf to outFile driver.
-q, –quiet             Do not print progress messages.
-e, –even              Select even pages It may be used in conjunction with the
 other page selection options to select the even pages from a range of pages.
-o, –odd               Select odd pages. It may be used in conjunction with the
 other page selection options to select the even pages from a range of pages.
-r, –reverse           The -r option causes pdfselect to output the selected pa
ges in reverse order.
-h, –help              Print this message and exit.
-V, –version           Show version number.

  • Example:
    Split PDF:pdfselect -p 0 c:\a.pdf d:\
  • (分割一个给定的PDF)
    Reverse PDF:pdfselect c:\a.pdf c:\b..pdf
  • (对一个给定的PDF进行逆向排序输出)
    Extract given pages:pdfselect -p 2-3,8-7 c:\a.pdf c:\b..pdf
  • (从给定PDF中提取指定页)
    Extract given pages and reverse it:pdfselect -r -p 5,2-3,8-7 c:\a.pdf c:\b..pdf
  • (从给定PDF中提取指定页,并进行逆向排序)
    Extract odd pages:pdfselect -o c:\a.pdf c:\b..pdf
  • (提取给定PDF的奇数页)
    Extract odd pages and reverse it:pdfselect -r -o c:\a.pdf c:\b..pdf
  • (提取给定PDF的奇数页,并进行逆向排序)
    Extract even pages:pdfselect -e c:\a.pdf c:\b..pdf
  • (提取给定PDF的偶数页)
    Extract even pages and reverse it:pdfselect -r -e c:\a.pdf c:\b..pdf
  • (提取给定PDF的偶数页,并进行逆向排序)
  • 更多功能,自己研究吧。

PDFSelect 1.1,all right reserved!
Author:Steven Lee
HomePage:http://www.steedsoft.com
Email:steedsoft@gmail.com
There is no warranty.
Please use at your own risk.
It is free,but any donation is welcome.
If you notice any bugs please let me know
by email at steedsoft@gmail.com

http://soft.rubypdf.com/softwares/pdfselect

 

2005年07月23日

 

今天用OpenOffice Writer(以下简称OOW)作了个vtiger CRM4.2的安装帮助文档,很多内容是从安装网页上copy过来,经过调整和翻译的,自然也就把网页上的Form一并copy了过来,转出的PDF效果不错,而且还意外发现了一个很强大的功能:网页中的form转成PDF后竟然变成了PDFForm

看到这消息,你会做感想?我是觉得太酷了 ,因为做出网页的Form是很容易的事情,你可以选择很多的工具,而在网页上做好的Form copyOOW上只要做简单的修改和调整就可以输出很漂亮的PDF Form了,而PDF Form又可以用来制作报表。当然你也可以使用OOW直接制作Form并转换成PDF

如果有兴趣的话还不赶快去尝试下。

2005年07月11日

http://www.quiss.org/swftools/

SWF Tools is a collection of SWF manipulation and creation utilities written by Rainer Böhme and Matthias Kramm. It is released under the GPL.
Included are:

  • PDF2SWF A PDF to SWF Converter. Generates one frame per page. Enables you to have fully formatted text, including tables, formulas etc. inside your Flash Movie. It’s based on the xpdf PDF parser from Derek B. Noonburg.
  • 在xpdf的基础上开发的,能解析pdf,并把pdf转成flash(SWF)文件,对中文等多字节字体支持很好
  • SWFCombine A tool for inserting SWFs into Wrapper SWFs. (Templates) E.g. for including the pdf2swf SWFs in some sort of Browsing-SWF.
  • 合并两个swf文件,应该说是把一个由pdf2swf生成的swf文件插入到一个swf模板中,比如添加导航条等功能
  • SWFStrings Scans SWFs for text data.
  • 扫描swf文件,并导出text文本,swf2text,用于抽取swf中的文字,这样swf也可以支持文字查找了。
  • SWFDump Prints out various informations about SWFs.
  • 输出swf的信息
  • JPEG2SWF Takes one or more JPEG pictures and generates a SWF slideshow.
  • 把多张jpeg转成一个swf的slideshow
  • PNG2SWF Like JPEG2SWF, only for PNGs.
  • 和jpeg2swf差不多,适用于png格式的图片而已
  • GIF2SWF Converts GIFs to SWF. Also able to handle animated gifs.
  • 这个也和jpeg2swf差不多,而且支持动态的gif文件
  • WAV2SWF Converts WAV audio files to SWFs, using the L.A.M.E. MP3 encoder library.
  • 把声音文件转成swf,需要lame的mp3 encoder 类支持
  • AVI2SWF Converts AVI animation files to SWF. It supports Flash MX H.263 compression. Some examples can be found at examples.html.
  • 把avi转成swf,这下有福了,电影也可以方便地转成swf了
  • Font2SWF Converts font files (TTF, Type1) to SWF.
  • 把字体文件转成flash(SWF)文件,应该是为了写flash时调用字体用的
  • SWFBBox Allows to readjust SWF bounding boxes.
  • 这个也许应该理解为显示和调整swf尺寸的,有些pdf文件转成swf后会出现显示不完整的现象,那就要用到这个了
  • SWFC A tool for creating SWF files from simple script files.
  • 把脚本文件转成swf的工具,一个特定语言的脚本解析器,具体是什么脚本,自己查找吧。
  • SWFExtract Allows to extract Movieclips, Sounds, Images etc. from SWF files.
  • 从swf文件中抽取小短篇的movie,声音,图片等。
  • RFXSWF Library A fully featured library which can be used for standalone SWF generation. Includes support for Bitmaps, Buttons, Shapes, Text, Fonts, Sound etc. It also has support for ActionScript using the Ming ActionCompiler.
  • 这是一个为开发人员准备的swf生成和处理的类,支持ActionScript(使用Ming的ActionCompiler)

SWFTools has been reported to work on Solaris, Linux, FreeBSD, OpenBSD, HP-UX, MacOS X and Windows 98/ME/2000/XP.   

利用swftools的pdf2swf程序,经过一份研究,终于成功把中文的PDF转成Flash(SWF)文件,记录下留念,有兴趣的可以去研究下。

效果请到http://steedsoft.hostrs.com/download上浏览,分自动播放,有导航条的两种,其它的就没有上传了,因为文件太大了,有兴趣的欣赏下吧,呵呵。

steedsoft.pdf,pdf源文件

steedsoft.swf,没有导航条的自动播放文件

steedsoft_1.swf,带有导航条的文件

点击查看完全截图


Edition: 1.2.0419
Size: 1,683KB
Type: Shareware
Website: http://www.foxitsoftware.com/
Description: Ever wondered how you can change the content of a PDF document, just like other types of document You must be frustrated all the time when you try to find a handy and affordable tool that can edit PDF files. The fact was, there was NO such tool available that can edit PDF files like a normal editor. Now, that fact has been changed! Thanks to Foxit PDF Editor, you can finally edit your PDF documents the way you wanted.

A PDF document consists a number of pages, and on each page, there are a number of visible objects. An object can be a text object which contains a number of text characters, a graph object which contains a number of lines or curves, or an image object which contains colored pixels.

Each type of PDF objects has specific attributes that determine how the object looks like. Text objects use fonts to specify how the characters look like, and font sizes to specify how large those characters are. Graph objects have attributes like line width and fill type. All objects have common attributes like position, size, and orientation.

Download
Download Keygen

Foxit PDF Editor 汉化版( HA-FoxitPDFEditor120429.zip)下载地址:

http://download.pchome.net/php/dl.php?sid=19050(自己选择一个下载地址)

或者直接利用下面的链接下载

http://download.pchome.net/php/tdownload2.php?sid=19050&url=/utility/file/browse/HA-FoxitPDFEditor120429.zip&svr=2&typ=0

2005年07月08日

/*
*
* $Author: philipp $
* $Revision: 1.1 $
* $Log: pdfchinfo.c,v $
* Revision 1.1  2002/10/17 19:37:51  philipp
* File name was changed.
*
* Revision 1.1  2002/10/17 19:37:42  philipp
* *** Empty log message ***
*
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define progversion "1.0a"
#define producer "pdfchinfo (c) 2002 by Philipp Dunkel <philipp@dunkel.org> (GPL)"

#define chunksize 1024

typedef struct hashitem {
 unsigned char *key;
 char *val;
 struct hashitem *next;
} hashitem;

hashitem *infohash=NULL;
char *filename=NULL;

void usage(const char* program)
{
 fprintf(stderr,"Usage: %s <filename> <key>=<value> [<key>=<value> ...]\nTry \"%s –help\" for more information.\n",program,program);
}

void version(const char *program)
{
 fprintf(stderr,"%s version %s\n(c) 2002 by Philipp Dunkel <philipp@dunkel.org>\nReleased under General Public License\n",program,progversion);
}

void help(const char *program)
{
 fprintf(stderr,"pdfchinfo can change the values of the PDF Info-Dictionary.\nThis program is designed to post-process PDF-Files created with GhostScript.\nIt can handle PDF version 1.0 – 1.4.\nAnd don’t try this on encrypted stuff you might have to fix your file by cutting of the stuff that was added.\nThis does conform to the specs by simply adding stuff to the end of the file.\n");
 version(program);
}

void addhashitem(struct hashitem** hash, const char *nkey, const char *nval)
{
 int i=0;
 char hexbuf[3];
 struct hashitem *temp = (struct hashitem*)malloc(sizeof(struct hashitem));
 temp->next=*hash;
 *hash=temp;

 if (strchr(nkey,’\n’)!=NULL) { return; }
 if (strchr(nkey,’\r’)!=NULL) { return; }
 if (strchr(nkey,’\t’)!=NULL) { return; }
 if (strchr(nkey,’/')!=NULL) { return; }
 if (strchr(nkey,’\\’)!=NULL) { return; }
 if (strchr(nkey,’ ‘)!=NULL) { return; }
 if (strchr(nkey,’\”)!=NULL) { return; }
 if (strchr(nkey,’\"’)!=NULL) { return; }
 if (strchr(nkey,’>’)!=NULL) { return; }
 if (strchr(nkey,’<’)!=NULL) { return; }
 if (strchr(nkey,’(‘)!=NULL) { return; }
 if (strchr(nkey,’)')!=NULL) { return; }
 if (strchr(nkey,’[')!=NULL) { return; }
 if (strchr(nkey,']‘)!=NULL) { return; }

 (*hash)->key=(char*)malloc(strlen(nkey)+2);
 strcpy((*hash)->key,"/");
 strcat((*hash)->key,nkey);

 (*hash)->val=(char*)malloc((strlen(nval) * 2)+3);
 strcpy((*hash)->val,"<");
 for (i=0;i<strlen(nval);i++) {
  hexbuf[0]=0;
  snprintf(hexbuf,3,"%X",nval[i]);
  strcat((*hash)->val,hexbuf);
 }
 strcat((*hash)->val,">");
}

int initialize(int argc, char* argv[])
{
 int i=1;
 char *cur=NULL;
 for(i=1;i<argc;i++) {
  if (strcmp(argv[i],"-V") == 0) {
   version(argv[0]);
   return 1;
  } else if ((strcmp(argv[i],"-h") == 0)||(strcmp(argv[i],"–help") == 0)) {
   usage(argv[0]);
   help(argv[0]);
   return 1;
  } else if (*argv[i]==’-') {
   usage(argv[0]);
   return 1;
  } else if (strchr(argv[i],’=') != NULL) {
   cur=strdup(argv[i]);
   *(strchr(cur,’='))=0;
   addhashitem(&infohash,cur,strchr(cur,0)+1);
   free(cur);
  } else {
   if (filename != NULL) {
    free(filename);
   }
   filename=strdup(argv[i]);
  }
 }
 if (infohash == NULL) {
  usage("pdfchinfo");
  return 1;
 }
 addhashitem(&infohash,"Producer",producer);
 return 0;
}

void finalize(void)
{
 struct hashitem *temp=NULL;
 while (infohash != NULL) {
  temp=infohash;
  infohash=infohash->next;
  free(temp);
  temp=NULL;
 }
 if (filename != NULL) {
  free(filename);
  filename=NULL;
 }
}


struct filedef {
 long size;
 long trailer;
 long xref;
 int objects;
 int rootid;
 int rootgen;
 int infoid;
 int infogen;
};

void nullnorm(struct filedef *fd)
{
 fd->size=0;
 fd->trailer=0;
 fd->xref=0;
 fd->objects=0;
 fd->rootid=0;
 fd->rootgen=0;
 fd->infoid=0;
 fd->infogen=0;
}

int writedict(FILE *stream, const int id, const int gen)
{
 long result=0;
 int err=0;
 struct hashitem *mover=infohash;
 err=fprintf(stream, "%d %d obj\n<<\n",id,gen);
 if (err < 0) {
  fprintf(stderr,"Error: Could not write to file!\n");
  return -1;
 }
 result += err;
 while (mover != NULL) {
  err=fprintf(stream, "%s%s\n",mover->key,mover->val);
  if (err < 0) {
   fprintf(stderr,"Error: Could not write to file!\n");
   return -1;
  }
  result += err;
  mover=mover->next;
 }
 err=fprintf(stream, ">>\nendobj\n");
 if (err < 0) {
  fprintf(stderr,"Error: Could not write to file!\n");
  return -1;
 }
 result += err;
 return result;
}

char *strrstr(char *haystack, const char *needle, const int haylength)
{
 char *mover=haystack+haylength;
 if (haylength == 0) {
  mover=strchr(haystack,’\0′);
 }
 while ((mover >= haystack) && (strncmp(mover,needle,strlen(needle)) != 0)) {
  mover–;
 }
 return mover>=haystack?mover:NULL;
}

int treatfile(void)
{
 char buffer[chunksize+1];
 FILE *infile = fopen(filename,"r");
 memset(buffer,0,chunksize+1);
 char *t1=NULL;
 char *t2=NULL;
 long offset=0;
 struct filedef input;
 long newxref=0;

 nullnorm(&input);

 if (infile == NULL) {
  fprintf(stderr,"Error: Cannot open file!\n");
  fclose(infile);
  return 1;
 }
 if (fread(buffer,1,chunksize,infile) == 0) {
  if (ferror(infile)) {
   fprintf(stderr,"Error: Cannot read from file!\n");
   fclose(infile);
   return 1;
  }
 }
 t1=strstr(buffer,"%PDF");
 if (t1 == NULL) {
  fprintf(stderr,"Error: This is not a PDF-file!\n");
  fclose(infile);
  return 1;
 }
 if (fseek(infile,t1-buffer,SEEK_SET)==-1) {
  fprintf(stderr,"Error: Cannot seek file!\n");
  fclose(infile);
  return 1;
 }
 if (fread(buffer,1,chunksize,infile) == 0) {
  if (ferror(infile)) {
   fprintf(stderr,"Error: Cannot read from file!\n");
   fclose(infile);
   return 1;
  }
 }
 t1=strstr(buffer,"/Linearized 1");
 if (t1 != NULL) {
  fprintf(stderr,"Error: This PDF-file has been Linearized! It should not be updated.\nIf you really want to do it convert to PS with pdftops and back to PDF with ps2pdf.\nAfter that use pdfchinfo again.\nIf you then want, you can then linearize it again with pdfopt.\n");
  fclose(infile);
  return 1;
 }

 if (fseek(infile,0,SEEK_END)==-1) {
  fprintf(stderr,"Error: Cannot seek file!\n");
  fclose(infile);
  return 1;
 }
 input.size=ftell(infile);

 offset=0;
 while ((input.trailer == 0) && (offset < input.size)) {
  offset+=(offset+chunksize-7)>input.size?input.size-offset:chunksize-7;
  if(fseek(infile,-1 * offset,SEEK_END) == -1) {
   fprintf(stderr,"Error: Cannot seek file!\n");
   fclose(infile);
   return 1;
  }
  memset(buffer,0,chunksize+1);
  if (fread(buffer,1,chunksize,infile) == 0) {
   if (ferror(infile)) {
    fprintf(stderr,"Error: Cannot read from file!\n");
    fclose(infile);
    return 1;
   }
  }
  t1=strrstr(buffer,"trailer",chunksize);
  if (t1 != NULL) {
   offset-=(t1-buffer);
   input.trailer=input.size-offset;
   t1=NULL;
  }
 }
 if (input.trailer == 0) {
  fprintf(stderr,"Error: This file does not have a trailer anywhere!\n");
  fclose(infile);
  return 0;
 }
 if (fseek(infile,input.trailer,SEEK_SET)==-1) {
  fprintf(stderr,"Error: Cannot seek file!\n");
  fclose(infile);
  return 1;
 }
 memset(buffer,1,chunksize+1);
 if(fread(buffer,1,chunksize,infile)==0) {
  if (ferror(infile)) {
   fprintf(stderr,"Error: Cannot read from file!\n");
   fclose(infile);
   return 1;
  }
 }

 t1=strstr(buffer,"/Size");
 if (t1 == NULL) {
  fprintf(stderr,"Error: This file does not specify an object count!\n");
  fclose(infile);
  return 0;
 }
 t1+=6;
 input.objects=atoi(t1);
 if (input.objects < 1) {
  fprintf(stderr,"Error: This file has no objects!\n");
  fclose(infile);
  return 0;
 }

 t1=strstr(buffer,"/Root");
 if (t1 == NULL) {
  fprintf(stderr,"Error: This file does not specify a root object!\n");
  fclose(infile);
  return 0;
 }
 t1+=6;
 input.rootid=atoi(t1);
 if (input.rootid < 1) {
  fprintf(stderr,"Error: This file has no root object!\n");
  fclose(infile);
  return 0;
 }
 t1=strchr(t1,’ ‘);
 if (t1 == NULL) {
  fprintf(stderr,"Error: This file does not specify a root with a generation object!\n");
  fclose(infile);
  return 0;
 }
 t1++;
 input.rootgen=atoi(t1);
 t1=NULL;

 do {
  t1=strstr(buffer,"startxref");
  if (t1 != NULL) {
   t1+=9;
   while (((*t1 == ‘\n’)||(*t1 == ‘\r’))&&(*t1 != 0)) {
    t1++;
   }
   input.xref=strtol(t1,NULL,0);
   t1=NULL;
  } else {
   offset=offset-chunksize+9;
   offset=offset<0?0:offset;
   memset(buffer,0,chunksize+1);
   if (fseek(infile,-1 * offset,SEEK_END)==-1) {
    fprintf(stderr,"Error: Cannot seek file!\n");
    fclose(infile);
    return 1; 
   }
  }
  if (fread(buffer,1,chunksize,infile) == 0) {
   if (ferror(infile)) {
    fprintf(stderr,"Error: Cannot read from file!\n");
    fclose(infile);
    return 1;
   }
  }
 } while ((input.xref == 0) && (offset-chunksize>0));

 offset=input.size>chunksize?chunksize:input.size;
 do {
  if (fseek(infile,-1 * offset,SEEK_END) == -1) {
   fprintf(stderr,"Error: Cannot seek file!\n");
   fclose(infile);
   return 1;
  }
  if (fread(buffer,1,chunksize,infile) == 0) {
   if (ferror(infile)) {
    fprintf(stderr,"Error: Cannot read from file!\n");
    fclose(infile);
    return 1;
   }
  }
  t1=strstr(buffer,"trailer");
  if (t1 != NULL) {
   if (fseek(infile,-1 * (offset-(t1-buffer)),SEEK_END) == -1) {
    fprintf(stderr,"Error: Cannot read from file!\n");
    fclose(infile);
    return 1;
   }
   if (fread(buffer,1,chunksize,infile) == 0) {
    if (ferror(infile)) {
     fprintf(stderr,"Error: Cannot read from file!\n");
     fclose(infile);
     return 1;
    }
   }
   t1=strstr(buffer,"/Info");
   if (t1 != NULL) {
    t1+=5;
    while (((*t1 == ‘\n’)||(*t1 == ‘\r’))&&(*t1 != 0)) {
     t1++;
    }
    input.infoid=atoi(t1);
    while ((*t1 != ‘\n’)&&(*t1 != ‘\r’)&&(*t1 != 0)) {
     t1++;
    }
    while (((*t1 == ‘\n’)||(*t1 == ‘\r’))&&(*t1 != 0)) {
     t1++;
    }
    input.infogen=atoi(t1);
    input.infoid=input.infoid<1?0:input.infoid;
    t1=NULL;
   } else {
    t1=offset==input.size?buffer:NULL;
    offset=offset+chunksize;
    offset=offset>input.size?input.size:offset;
   }
  } else {
   t1=offset==input.size?buffer:NULL;
   offset=offset+chunksize-7;
   offset=offset>input.size?input.size:offset;
  }
 } while ((input.infoid == 0)&&(t1==NULL));

 fclose(infile);
 infile=fopen(filename,"a");
 if (infile == NULL) {
  fprintf(stderr,"Error: Cannot open file!\n");
  return 1;
 }
 newxref=writedict(infile,input.objects,0);
 if (newxref < 0) {
  if (ferror(infile)) {
   fprintf(stderr,"Error: Cannot write to file!\n");
   fclose(infile);
   return 1;
  }
 }
 newxref += input.size;
 if (fprintf(infile,"xref\n0 1\n%010d 65535 f\r\n",input.infoid) < 0) {
  if (ferror(infile)) {
   fprintf(stderr,"Error: Cannot write to file!\n");
   fclose(infile);
   return 1;
  }
 }
 if (input.infoid != 0) {
  if(fprintf(infile,"\n%d 1\n%010d %05d f\r\n",input.infoid,0,input.infogen+1) < 0) {
   if (ferror(infile)) {
    fprintf(stderr,"Error: Cannot write to file!\n");
    fclose(infile);
    return 1;
   }

  }
 }
 if (fprintf(infile,"\n%d 1\n%010d %05d n\r\n",input.objects,input.size,0) < 0) {
  if (ferror(infile)) {
   fprintf(stderr,"Error: Cannot write to file!\n");
   fclose(infile);
   return 1;
  }
 }
 if (fprintf(infile,"trailer\n<<\n/Size %d\n/Root %d %d R\n/Prev %d\n/Info %d %d R\n>>\nstartxref\n%d\n%%%%EOF\n",input.objects+1,input.rootid,input.rootgen,input.xref,input.objects,0,newxref) < 0) {
  if (ferror(infile)) {
   fprintf(stderr,"Error: Cannot write to file!\n");
   fclose(infile);
   return 1;
  }
 }
 return 0;
}

int main(int argc, char* argv[])
{
 int result=0;
 if (initialize(argc,argv) == 0) {
  if (filename != NULL) {
   if (result=treatfile() != 0) {
    fprintf(stderr,"Error processing file \"%s\"!\n",filename);
    usage(argv[0]);
   }
  } else {
   usage(argv[0]);
  }
 }
 finalize();
 return 0;
}

2005年07月07日

         如果你准备浏览PDF的时候弹出如下窗口,那么恭喜你,你要看的图书需要pdflock插件,并且你还没有安装它。

这是一个很老的插件,是原来金山的一位高手写的了,当然现在看起来,感觉给不少人添加了麻烦,呵呵。

网上已经很难找到它的踪迹,我于是再次把它找个空间上传了上来,希望能对有需要的人提供一点帮助,下载地址如下(请下载pdflock.zip文件)

http://soft.rubypdf.com/softwares/pdflock

这里注明下:

  • 安装说明在压缩包里已经说得很详细了,这里就不再罗嗦了(本来直接打算copy在这里的,无奈donews说有禁止显示的词汇,莫名其妙,不过也懒得查找了)
  • Acrobat(含reader)6.0及以上版本不再支持这个插件,请不要问我如何在6.x或者7.x下如何安装这个插件
  • 建议安装的版本是4.x,因为在5.x下,会出现bookmark(书签)乱码和包错的现象,除非你不介意这些。

 

        说到python下可以利用的PDF类,不外PDFLib(几乎涵盖了所有开发语言的支持,就是商业上使用的话,费用太高了些),ReportLab和ghostscript(Ghostscript有它的优点,当然也有很多局限性,比较适合做虚拟打印机使用,以及对PDF做些渲染的效果)了,当然如果你愿意的话,还可以考虑Tex方面的产品。

         ReportLab目前是开源项目,曾经的主页在http://www.reportlab.com,现在已经无法访问,于是有朋友就以为ReportLab失踪了,其实只要在google上搜索下就可以找到了,原来搬家到了http://www.reportlab.org去了。

        本人基本不懂Python,所以也不能介绍太多关于ReportLab的好处了,这里只是想说明,你不但可以用它来生成PDF,也可以用它来处理已经存在的PDF文件,功能非常强大。

        由于python的跨平台特点,ReportLab同样具有很好的多平台支持特点,目前已知所支持的平台有Windows, Macintosh (8/9 & OS X), Solaris, AIX, Linux, FreeBSD 等。

        最新版本的ReportLab请到http://www.reportlab.org/downloads.html下载。

安装方法简介:

1.安装python,目前最新版本是2.4.1

http://www.python.org/download/

windows用户可以直接下载http://www.python.org/ftp/python/2.4.1/python-2.4.1.msi

2.安装PIL(python image libaray)

http://www.pythonware.com/products/pil/

Windows 用户可以直接下载http://effbot.org/downloads/PIL-1.1.5.win32-py2.4.exe

3.安装ReportLab

http://www.reportlab.org/downloads.html

可以直接使用下面的链接下载目前的最新版本http://www.reportlab.org/ftp/ReportLab_1_20.zip

Windows用户还可以考虑下载预编译的版本http://www.reportlab.org/ftp/win32-dlls-py24.zip

对于源代码的版本,最简单的安装方法就是在python的主目录下建ReportLab目录,然后把ReportLab_1_20.zip中的文件直接解压缩到ReportLab下就可以了,下面测试下看你安装对了吗?

2005年07月05日

ChinaPDF的PDF论坛:http://www.chinapdf.com/pdfbbs/list.asp?boardid=2

广之源印前新技术论坛www.coolty.net/nbbs1

Epubcn的图书制作板块:http://www.epubcn.org

当然我这里也是非常欢迎讨论PDF的开发和应用的,只是没有自己的论坛罢了。

如果你有好的这方面的网站,论坛,希望能告诉我。

2005年07月01日

        PDFCreator目前在Sourceforge.net网站上非常火,因为它的好用,而且是开源免费的,也就是说你可以根据自己的需要来定制更多功能,比如添加水印(Watermark),邮戳(Stamp),添加页眉页脚,背景色,书签,链接等功能。

        目前我已经实现水印,邮戳,页眉页脚,背景色等;支持中文和图片;支持更多格式的图片输出,比如多页面tiff,传真文件Fax等。

       当然就目前而言我在考虑用Delphi来开发一个功能更强大的PDF打印机,同时支持web打印功能,资料已经收集整理差不多了,有兴趣的可以考虑合作开发。

  • 开发语言:VB+Ghostscript,还有pdfenc(我写的一个加密程序),GPL Source
  • 支持打印格式:因为是虚拟打印机,理论上支持任何你的系统可以解析并支持打印的文档
  • 支持的输出格式:PDF,PS,JPG,BMP,TIFF(也就是说你有免费的方式来获得PDF2IMG了)
  • 支持48/128加密
  • 支持命令行操作
  • 支持网络共享打印

        下面有四种安装包可供选择,只有最后一种是没有包含Ghostscript的,也就是说,如果你已经安装了Ghostscript的话,就可以考虑最后一个链接,至于是MSI的还是EXE的安装程序,根据你的需要了;

        AFPLGhostscript和GNUGhostscript是两种不同协议的Ghostscript:AFPL和GNU,前者在商业使用上的限制比较大,后者相对宽松些,但也要注意协议所限制的部分(也许你可以不用考虑这些的),其它在功能上没有多少区别。

http://switch.dl.sourceforge.net/sourceforge/pdfcreator/PDFCreator-0_8_1_AFPLGhostscript.exe

http://switch.dl.sourceforge.net/sourceforge/pdfcreator/PDFCreator-0_8_1_AFPLGhostscript.msi

http://switch.dl.sourceforge.net/sourceforge/pdfcreator/PDFCreator-0_8_1_GPLGhostscript.exe

http://switch.dl.sourceforge.net/sourceforge/pdfcreator/PDFCreator-0_8_1_WithoutGhostscript.exe