2005年08月28日

因为空间的问题,我上传到http://hardrock.cnblogs.com上了

下载路径为http://hardrock.cnblogs.com/Files/hardrock/iTextSharp.tutorial.zip

介绍参考http://hardrock.cnblogs.com/archive/2005/08/28/224200.html

因为工作的关系,iTextSharp tutorial的翻译工作只好暂时搁浅。

2005年08月19日

经过近一个星期(利用早晨的时间)调试了http://itextsharp.sourceforge.net/tutorial/下所有教程,总计111个程序(多数还没有来得及研究,只是调试通过,正确输出结果),除了Chap0908(没有PdfBarcode类,无法测试),并另外又补充了10个没有被收录的程序(来自iText的教程,补充工作继续中)。

测试的同时发现了iTextSharp的2个bug,其中一个在最新版本已经修改过来了,还有一个是我今天刚提交的。

另外添加了对STSong-Light这类字体的支持,这样对PDF的Form填写也可以方便实现了。

http://switch.dl.sourceforge.net/sourceforge/itextsharp/itextsharp-3.0.6.zip

http://switch.dl.sourceforge.net/sourceforge/itextsharp/itextsharp-3.0.6-dll.zip

Changes in iTextSharp 3.0.6 (2005-08-18) 
 
- constructor Image(Image) didn’t copy one of the fields 
 
- Image.ScaledToFit() didn’t take rotation into account 
 
- Table.Width was not being overriden. The result was an exception in PdfDocument 
 
- added BaseFont.CorrectArabicAdvance() to make Arabic Diactrics (tashkeel) 
have zero advance. Some Microsoft fonts like Arial.ttf have non-zero advances 
that confuse the Arabic shaper. 
 
- in PdfDocument the waiting image in the last page was not being placed 
 
- PdfString didn’t output the BOM in Unicode 
 
- PdfStamper supports encryption in append mode 
 
- added verbose analysis of the permissions in PdfEncryptor 
 
- fixed a conversion bug in PdfPCell.NoWrap 
 
- PdfReader.SelectPages() is working again 
 
- PdfWriter.PrintScalingNone had the wrong value 
 
- fixed a conversion bug in SimpleBookmark.IterateOutlines() 
 
- MultiColumnText didn’t respect mirrored margins 
 
- in RTF added the option for chars above ‘z’ to not be encoded in Unicode 
to support older Word versions 

测试例子(翻译自Chap13_form.java程序,已经成功转为Chap13_form.cs,iTextSharp中没有收录这个iText下的教程代码):
            String[,] colorvalues = {{"#FF0000", "Red"}, {"#00FF00", "Green"}, {"#0000FF", "Blue"}};

            acroForm.AddSelectList("list2", colorvalues, "#0000FF", helv, fontSize, 315, 550, 450, 600);
            acroForm.AddComboBox("combo2", colorvalues, "#0000FE", false, helv, fontSize, 315, 440, 450, 490);

出错:System.IndexOutOfRangeException

AddComboBox的bug比较隐蔽,除非你故意把defaultValue输为colorvalues 数组中不存在的值,否则不会导致错误抛出。

public PdfFormField AddComboBox(string name, string[,] options, string defaultValue, bool editable, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
        PdfFormField choice = PdfFormField.CreateCombo(writer, editable, options, 0);
        SetChoiceParams(choice, name, defaultValue, llx, lly, urx, ury);
        string value = null;
        for (int i = 0; i < options.GetLength(0); i++) {//Steven Lee 20050819,原来为options.Length
            if (options[i, 0].Equals(defaultValue)) {
                value = options[i, 1];
                break;
            }
        }
        if (value == null) {
            value = options[0, 1];
        }
        DrawSingleLineOfText(choice, value, font, fontSize, llx, lly, urx, ury);
        AddFormField(choice);
        return choice;
    }

public PdfFormField AddSelectList(string name, string[,] options, string defaultValue, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
        PdfFormField choice = PdfFormField.CreateList(writer, options, 0);
        SetChoiceParams(choice, name, defaultValue, llx, lly, urx, ury);
        StringBuilder text = new StringBuilder();
        for (int i = 0; i < options.GetLength(0); i++) {//Steven Lee 20050819,原来为options.Length
            text.Append(options[i, 1]).Append("\n");
        }
        DrawMultiLineOfText(choice, text.ToString(), font, fontSize, llx, lly, urx, ury);
        AddFormField(choice);
        return choice;
    }

2005年08月14日

        今天调试了http://itextsharp.sourceforge.net上第一章的教程,竟然发现多数都无法调试通过(估计是使用转换工具转换过来的),而且主要是方法首字母应该转为大写的问题,当然还有一部份是其他原因,感觉真的不是很爽,花了1个小时的时间把第一章的全部教程都修改了下,现在可以了,方便的时候会传到网上供大家分享。

2005年07月30日

iTextSharp作者对iTextSharp的介绍非常简单:iTextSharp is a port of the iText, a free Java-Pdf library,那iText又是什么呢?一个可以方便PDF生成和处理的Java library。

也许你会问,为什么选择iTextSharp而不是iText呢?答案是你为什么要学C#/VB.net,而不是学java呢?

iTextSharp目前版本是3.0.5(基于iText1.3.1和当前的cvs)

下载地址为:

预编译版本:http://switch.dl.sourceforge.net/sourceforge/itextsharp/itextsharp-3.0.5-dll.zip

源代码:http://switch.dl.sourceforge.net/sourceforge/itextsharp/itextsharp-3.0.5.zip

基于The Microsoft .Net Framework 1.1

可以使用VS.Net2003或者sharpdevelop(我在家使用的就是这个,Version1.1.0,build 1964)

不过使用sharpDevelop编译iTextSharp的时候会报找不到Function USR和EqualsIgnoreCase,解决办法,用查找替换的方法替换所有USR为System.util.USR,EqualsIgnoreCase为System.util.EqualsIgnoreCase。如果还有什么问题的话请留言。

下面开始我们的第一个例子了,一门语言的教学第一个例子往往就是helloworld,那我们也别搞什么特殊化了,就以helloworld为开始吧。

其实创建一个生成hellworld.pdf的小程序真的很简单,只需以下5步:

Step 1:
创建一个iTextSharp.text.Document-object的实例:
Document document = new Document();

Step 2:
Creates a Writer that listens to this document and writes the document to the Stream of your choice:
创建PdfWriter用于监听document,并把document写入你所选择的流:
PdfWriter.getInstance(document, new FileStream("Chap0101.pdf", FileMode.Create));

Step 3:
打开document:
document.Open();

Step 4:
给document添加内容:
document.Add(new Paragraph("Hello World"));

Step 5:
关闭document:
document.Close();

是不是很简单?

C#代码:

/*
 * Created by SharpDevelop.
 * User: hy
 * Date: 2005-7-30
 * Time: 20:42
 *
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;
namespace helloworld
{
 class MainClass
 {
  public static void Main(string[] args)
  {
   Console.WriteLine("Hello World!");
   Document doc=new Document();
   PdfWriter.GetInstance(doc,new FileStream(@"c:\helloworld.pdf",FileMode.Create));
   doc.Open();
   doc.Add(new Paragraph("hello world!"));
   doc.Close();
  }
 }

VB.net代码:

Imports System
Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports System.IO
Namespace helloworld

 Class MainClass

  Public Shared Sub Main(ByVal args As String())
   Console.WriteLine("Hello World!")
   Dim doc As Document = New Document
   PdfWriter.GetInstance(doc, New FileStream("c:\helloworld.pdf", FileMode.Create))
   doc.Open
   doc.Add(New Paragraph("hello world!"))
   doc.Close
  End Sub
 End Class
End Namespace

注意:别忘了在你的例子中引用iTextSharp哟。