posts - 184,  comments - 1143,  trackbacks - 5
   
    越来越多的人来信或者留言(甚至msn上找我),询问关于PDF Form填写的问题,尤其是中文(或者说中日韩文)表单填写的问题,本不想回答这类问题,因为相关的注意事项都已经在我的博客里说了,但现在看来还是有必要再啰唆下了,如果再有问题的话,希望带着Money来问,拜托了。  

下面这段代码根据iText的java教程修改而成,主要有一下用途:
1.填写表单;
2.利用CID字体填写中文(CJK:中日韩)表单;
3.利用TrueType字体填写中日韩表单(因为字体嵌入,生成的PDF会非常大);
4.支持服务端PDF的填写;

 1             //如果不使用CID字体,下面三行不需要
 2             BaseFont.AddToResourceSearch("iTextAsian-1.0.dll");
 3             BaseFont.AddToResourceSearch("iTextAsianCmaps-1.0.dll");
 4             BaseFont font = BaseFont.CreateFont("STSong-Light""UniGB-UCS2-H", BaseFont.EMBEDDED);
 5             
 6             PdfReader reader = new PdfReader("SimpleRegistrationForm.pdf");
 7             
 8             PdfStamper stamp1 = new PdfStamper(reader, new FileStream("registered.pdf",FileMode.Create));
 9 
10             //如果你想在asp.net中进行表单填写,下面这句非常重要,当然上面的FileStream也最好换成MemStream或者别的Stream实例
11             //stamp1.Writer.CloseStream=false;
12 
13 
14             //使用TrueType字体
15             //BaseFont font = BaseFont.CreateFont("c:\\windows\\fonts\\STSONG.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
16 
17             AcroFields form1 = stamp1.AcroFields;
18 
19             //当你需要修改某个Field的字体属性时
20             form1.SetFieldProperty("name","textfont",font,null);
21 
22             //以下为填写表单部分
23             form1.SetField("name""利用iText#填写中文表单");
24             form1.SetField("address""http://hardrock.cnblogs.com");
25             form1.SetField("postal_code""200051");
26             form1.SetField("email""rocsky@gmail.com");
27             stamp1.Close();


P.S.
关于Java下的解决方案可以参照上面的C#代码和下面的Register.java代码稍加修改即可。

参考资料
SimpleRegistrationForm.pdf
Register.java

在线的例子:Demo: Fill and Save PDF Form online(also can add more function,such as email and save data to database ),Adobe Reader is enough

如果你想利用FDF来填写表单,那么改写下面的代码吧
field_merge: Example code of Early Access iText(how to fill PDF form with iTextSharp)

如果你的想同时对PDF进行签名,那么下面的肯定是你想要的
利用iTextSharp对PDF进行签名(E-signing PDF documents with iTextSharp)--推荐

在asp.net中使用时候的注意事项:
iTextSharp应用中关于“Cannot access a closed Stream”问题的解决办法(附带提供如何在页面中显示PDF的流)

iTextSharp使用CID字体的问题:
iTextSharp 将亚洲字体支持(CIDFonts)和itext-hyph-xml 发布为独立的library

你还打算知道些什么?从上面的链接我想你可以看到,该注意的事项基本都已经说过了。

该文目前没有解决一个问题,怎么样填写用Adobe Designer设计的表单(一般的回答是iTextSharp不支持,这样回答也没有错,不过还是有办法填写的,这个就暂时保密吧,iTextSharp很快应该就支持了;我上面有个demo就是填写的Adobe Designer设计的表单)。

注意事项,如果你想用CID字体填写表单,那么你需要大于iTextSharp3.14的版本,也就是说现在(2006-09-23)及未来的一小段时间你需要从iTextSharp的csv上得到最新的版本来避免3.14及以前版本的bug(文字前有两个小空格)。

不知道诸位觉得是否有必要写本《iTextSharp实践》的书呢?如果觉得有必要,你希望了解哪些?

posted on 2006-09-23 13:44 RubyPDF 阅读(14384) 评论(187)  编辑 收藏 所属分类: iTextSharp(iText#)

FeedBack:
2006-09-25 02:14 | 迷惘夜车 [未注册用户]
HardRock 您好:
本人有机会接触到一个政府电子政务系统的前期策划。其中比较头疼的就是公文审批,最近了解了一些资料,知道了主要的解决办法无外乎一种就是用微软的office系列或者就是adobe的PDF。考虑到是政府项目有可能需要跨平台应用,所以首选adobe。查了几天的资料,还有一些问题不是很明白,需要老大援手:
1、因为adobe并不是专业的文档编辑软件,所以起草公文不可能直接就用adobe。那么用office还是html?如果是office,那么如何实现把office内容嵌入pdf(因为还需要在PDF增加其他的内容)?当然用到office就牵扯到跨平台问题。不过还是想了解一下。如果用html?那么嵌入表格、图片以及文字排版,又会比较头疼,转化为PDF也是比较麻烦?对于html方式,是不是有好的解决办法?
2、我看了itextdocs.lowagie.com上面几乎所有的示例,唯独没有看到在PDF中如何提交表单的例子。你那个iText在线表单的例子,我学习一下?顺便除了iText外,有没有其他的好办法?

谢谢先。



  回复  引用    
#2楼 [楼主]
2006-09-25 09:16 | HardRock      
@迷惘夜车
你在问我这些问题之前是否自己做过什么尝试?你感觉有什么方案,碰到什么问题?
  回复  引用  查看    
2006-09-25 09:45 | gzj [未注册用户]
用.net自带的水晶报表可以选择以pdf,excel,html 的格式任意选择在线打开
或者下载。 我们的报表用的是水晶报表+access mdb的2种方式。
  回复  引用    
2006-10-22 10:18 | 鏀炬斁 [未注册用户]
HardRock老师,请问我下面的代码生成出来的pdf用acrobat reader打开后提示文件有误??谢谢!
win2000平台,itextsharp-3.1.5


private void Page_Load(object sender, System.EventArgs e)
{
MemoryStream m = new MemoryStream();
Document document = new Document();
try
{
// step 2: we set the ContentType and create an instance of the Writer
Response.ContentType = "application/pdf";
Response.AddHeader("Content-disposition", "attachment; filename=example.pdf");

PdfWriter.GetInstance(document, m);


// step 3
document.Open();

BaseFont bf = BaseFont.CreateFont("c:\\WINNT\\fonts\\simkai.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);


iTextSharp.text.Font font1 = new iTextSharp.text.Font(bf,45,iTextSharp.text.Font.NORMAL);


document.Add(new Paragraph("杭州123", font1));



}
catch (DocumentException ex)
{
Console.Error.WriteLine(ex.StackTrace);
Console.Error.WriteLine(ex.Message);
}
// step 5: Close document
document.Close();
//Response.End();


// // step 6: Write pdf bytes to outputstream
Response.OutputStream.Write(m.GetBuffer(), 0, m.GetBuffer().Length);
Response.OutputStream.Flush();
Response.OutputStream.Close();
// 在此处放置用户代码以初始化页面


}
  回复  引用    
#5楼 [楼主]
2006-10-23 09:27 | HardRock      
@鏀炬斁
你的问题上面已经谈到了
在asp.net中使用时候的注意事项:
iTextSharp应用中关于“Cannot access a closed Stream”问题的解决办法(附带提供如何在页面中显示PDF的流)
  回复  引用  查看    
2006-10-23 19:26 | 鏀炬斁 [未注册用户]
老大,谢谢你的回答!在参考日本的网站做法后,已经顺利生成PDF!

还有一个问题:

利用CID字体填写中文始终不行,而利用TrueType字体填写则可以,方法是参考你的文章的

我的系统是2000,acrobat reader 5 ,安装了字体插件,请问还要装其它软件才能用CID吗?
  回复  引用    
#7楼 [楼主]
2006-10-23 21:52 | HardRock      
@鏀炬斁
看来我给你的答案并不能满足你的要求,请继续参考日本网站的做法吧,如果不行我再告诉你我的做法,相信日本网站应该也有这个你想要的答案。
  回复  引用  查看    
2006-10-24 01:24 | 鏀炬斁 [未注册用户]
谢谢老大!
我参照你的方法,CID在我的机器上还是不行,是不是要安装其它软件?请你再指点俺,谢谢你的帮助!
  回复  引用    
2006-10-26 19:27 | HWCheng [未注册用户]
个人感觉iTextSharp有点博大精深,本人在.NET 中生成一个二维条码,使用Graphics对象,但使用iTextSharp生成到PDF文件中后,发觉条码中黑白交界处有平滑过渡,相当模糊,不知道应该设置取消平滑?
  回复  引用    
#10楼 [楼主]
2006-10-27 10:09 | HardRock      
@HWCheng
同样的留言在相关帖子下留言一次就可以了,拜托了,另外一处我已经回复你了。
  回复  引用  查看    
#11楼 [楼主]
2006-10-27 10:11 | HardRock      
@鏀炬斁
CID的做法和我相关文章中介绍的没有区别,有问题请提供相关代码示例,谢谢合作。
rocsky#gmail.com
  回复  引用  查看    
2006-11-08 08:22 | 游客 [未注册用户]
Hi HardRock,我想和你合作,能否和我联系一下(yh.wang.cn@gmail.com)?
  回复  引用    
2006-11-08 10:56 | winsor [未注册用户]
问您个问题
就是我用的是CID填充表单,要往里面填个半角的¥而在PDF里面显示的是\
请问有没有什么办法解决
谢谢
  回复  引用    
#14楼 [楼主]
2006-11-08 11:12 | HardRock      
@游客
email已经发出,请查收
  回复  引用  查看    
2006-11-08 12:45 | 鏀炬斁 [未注册用户]
请问老大,用以下代码生成的pdf显示空白,请问是什么原因,谢谢!

private void Page_Load(object sender, System.EventArgs e)
{

MemoryStream m = new MemoryStream();
Document document = new Document();
try
{
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetExpires(DateTime.Now.AddSeconds(5));
Response.ContentType = "application/pdf";
Response.AddHeader("Content-disposition", "inline; filename=HelloWorld.pdf");

PdfWriter.GetInstance(document, Response.OutputStream);

BaseFont.AddToResourceSearch("c:\\iTextAsian.dll");
BaseFont.AddToResourceSearch("c:\\iTextAsianCmaps.dll");
BaseFont bf= BaseFont.CreateFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);

iTextSharp.text.Font font9 = new iTextSharp.text.Font(bf,9,iTextSharp.text.Font.NORMAL);
iTextSharp.text.Font font1 = new iTextSharp.text.Font(bf,45,iTextSharp.text.Font.NORMAL);

HeaderFooter header = new HeaderFooter(new Phrase("杭州abcd",font9), false);
document.Header = header;
document.Open();
document.Add(new Paragraph("杭州123", font1));

}
catch (DocumentException ex)
{
Console.Error.WriteLine(ex.StackTrace);
Console.Error.WriteLine(ex.Message);
}

document.Close();

Response.Flush();
Response.End();

// 在此处放置用户代码以初始化页面


}
  回复  引用    
#16楼 [楼主]
2006-11-08 13:28 | HardRock      
@winsor
半角的¥的ASCII码是几?
  回复  引用  查看    
#17楼 [楼主]
2006-11-08 13:36 | HardRock      
@鏀炬斁
在我机器上正常,你那里没有任何报错吗?
  回复  引用  查看    
2006-11-08 13:40 | winsor [未注册用户]
92 是\这个的ASCII码,半角的¥编码是一样的
  回复  引用    
#19楼 [楼主]
2006-11-08 13:47 | HardRock      
@winsor
怎么可能两个字符使用同一个ASCII码呢?
半角的¥的unicode码呢?
这个字符有半角的吗?
  回复  引用  查看    
#20楼 [楼主]
2006-11-08 14:05 | HardRock      
关于人民币符号在电脑里的表示
在Unicode编码里,U+00A5(元的Latin-I区符号,可以理解成半角)是两横的,U+FFE5(元的全
角符号)是一横的,所以能区分开来。但是,在大陆中文所用的传统的GB2312/GBK编码里面,由
于编码设计的原因,半角字符都在7bit的ASCII区,因此这个两横的半角元无法在GB2312/GBK中表
示。在Windows的默认转换规则中转换为全角的而不是丢弃。所以我们通常只能看到一横的元了。
  回复  引用  查看    
2006-11-08 14:07 | winsor [未注册用户]
@HardRock

日文里面半角¥跟\是一样的编码啊
unicode 半角 92 0
全角 229 255
  回复  引用    
#22楼 [楼主]
2006-11-08 14:22 | HardRock      
@winsor
¥可以指:
* 人民币符号的简写,完整写法是“RMB¥”或者“RMB¥”,ISO 4217代码 CNY;
* 全角日圆符号,但一般使用半角符号“¥”表示日圆,ISO 4217代码 JPY。

转自维基百科,现在又不能访问维基百科,用代理才行。
  回复  引用  查看    
2006-11-08 14:25 | winsor [未注册用户]
谢谢您,问题解决了
用了这个CultureInfo bz = new CultureInfo("ja-JP");
  回复  引用    
#24楼 [楼主]
2006-11-08 14:36 | HardRock      
@winsor
不客气
  回复  引用  查看    
2006-11-08 19:41 | 鏀炬斁 [未注册用户]
@HardRock

我这边没有报错啊,请问估计是什么原因??

我是win2000, acobat read 5.05

  回复  引用    
2006-11-08 19:52 | 鏀炬斁 [未注册用户]
请问估计是什么原因?? 能不能我们交流一下,谢谢qq19375523
我是win2000, acobat read 5.05
  回复  引用    
#27楼 [楼主]
2006-11-09 12:15 | HardRock      
@鏀炬斁
不是代码的问题,所以也不好说是什么问题
QQ加你了。
  回复  引用  查看    
2006-11-17 09:40 | schema [未注册用户]
请问怎么通过iText读取PDF文件内容??有没有事例代码
  回复  引用    
#29楼 [楼主]
2006-11-17 09:44 | HardRock      
@schema
我的博客中有相关文章,你自己找下吧
  回复  引用  查看    
2007-01-10 20:02 | lk [未注册用户]
用itext做开发,字体等由itextasian.jar 处理,在输出pdf时“堃”不能输出(其他中文可以),如“李堃”在网页上显示正常,输出到pdf时显示为“李”;同样的情况还发生在一些生僻字上,如“樑”,请问这该怎么办?
  回复  引用    
#31楼 [楼主]
2007-01-10 22:21 | HardRock      
你使用的具体是那个字体?
试过系统所带字体没有?
有时候可能是字体编码不全的缘故。
  回复  引用  查看    
2007-01-11 09:31 | lk [未注册用户]
具体如下:
BaseFont.createFont(
"STSong-Light",
"UniGB-UCS2-H",
BaseFont.NOT_EMBEDDED);
  回复  引用    
2007-01-11 10:21 | lk [未注册用户]
用到的其实是SIMFANG.TTF
  回复  引用    
#34楼 [楼主]
2007-01-11 11:17 | HardRock      
@lk
尝试下直接使用SimFang.ttf或者其他truetype字体。
  回复  引用  查看    
2007-01-25 12:17 | john [未注册用户]
我是itextsharp新手,现在需要根据用户任意提交的PDF模板文件,用新字符串选择替换PDF中某个字符串内容.
由于模版文件不是自己生成,所以必须读入文件内容,然后做字符替换,但替换后,文件显示不成功,或者有部分字符显示不出.
请问各位有何好办法?
谢谢!
  回复  引用    
2007-02-07 16:46 | heavenwing [未注册用户]
我看你的博客有个链接到e类出版物论坛,我想你应该是那个论坛的会员,我想注册次论坛,但没邀请码,不知你能不能给我提供一个邀请码吗?可以发我邮箱:heaven_win@163.com.谢谢了!
  回复  引用    
#37楼 [楼主]
2007-02-09 17:32 | HardRock      
@heavenwing
对不起,我帮不了你什么忙,你为什么要注册这个论坛呢?
  回复  引用  查看    
2007-03-08 11:42 | BlueStar [未注册用户]
您好、请教个问题
我用acrobat自己制作了一个模板、然后编写程序打开、进行赋值、都已经成功了。但是用类似这样的代码
form1.SetFieldProperty("name","textfont",font,null);
设置font或者color或者size时却没有效果
随后我尝试用程序生成包含一个textfield域的pdf后再运行我的程序、就成功了
比较两个模板发现区别在于程序编写的pdf中不包含可以edit的form、而用acrobat制作模板时是新建一个可以编辑的form然后在里面加textfield的、最后生成pdf时form依然是可以编辑的、打开显示"this document contance some interactive form fields"。而程序生成的pdf不包含这样的警告
请问如何使得手动制作的模板也可以进行Property的设置呢?(仅设置值是可以的)
谢谢!
  回复  引用    
2007-04-25 23:04 | rock [未注册用户]
我想請問一下,我如果使用系統內建字型時,產生的PDF檔案會非常大,因為
他把該字型內容也包進去,請問有人解決過這樣的問題ㄇ?
  回复  引用    
2007-05-18 09:45 | husan [未注册用户]
請問一下,我想寫入PDF時的字型是自行加入(華康標楷體...)的,我利用BaseF = BaseFont.CreateFont("c:\WINDOWS\fonts\DFTTBK5.TTC", BaseFont.IDENTITY_V, BaseFont.NOT_EMBEDDED),可是會出現錯誤訊息"Font 'c:\WINDOWS\fonts\DETTBK5.TTC' with 'Identity-H' is not recognized "。有人遇到這種問題嗎??該如何解決?我有試過用"新細明體"也不行耶!!
  回复  引用    
#41楼 [楼主]
2007-05-18 11:10 | HardRock      
@husan
BaseFont bf = BaseFont.CreateFont(@"c:\WINNT\Fonts\msgothic.Ttc,1", BaseFont.IDENTITY_H, true);

.ttc 是 .ttf 字体的集合,你必须指定使用其中的某个字体
  回复  引用  查看    
2007-05-19 21:37 | ricardo [未注册用户]
您好,我在做毕业设计 要求是给一个pdf文件增加水印和去除水印
利用itext增加水印已经实现,但是看了很多例子也没有提到去除水印的
非常希望能得到您的帮助和解疑 谢谢


  回复  引用    
#43楼 [楼主]
2007-05-19 22:18 | HardRock      
@ricardo
很抱歉,这忙我帮不了你。
你如何判断哪部分是水印?
这个做毕业设计,你努力干吧,将来可以作为商业软件来卖。
  回复  引用  查看    
2007-05-20 12:34 | ricardo [未注册用户]
@HardRock
根据iText文档中的描述watermark是添加到undercontent里的 不知道有没有办法把整个undercontent清空呢?

商业软件不敢指望,只求能够顺利毕业啊 ^_^ 谢谢
  回复  引用    
2007-05-24 23:03 | yutian33 [未注册用户]
请问一下,能否利用PdfReader中的方法GetPageContent读到的byte[]去生成一个新的pdf文件?

我的想法是直接修改那个byte[]中的一点小信息,然后生成新的pdf
  回复  引用    
#46楼 [楼主]
2007-05-25 06:57 | HardRock      
just try it.
  回复  引用  查看    
2007-05-30 14:39 | husan [未注册用户]
HardRock大大:上次的問題解決了,謝謝!!。想再請問2個問題:
1.現在字體的問題解決了,可是特殊字無法顯示出來,如"堃冲綉"。所以想請問是否可以像html一樣,當第一個字體找不到時,自動以第二個字體當順位??

2.table的問題,現在table可以自行設定欄寬,那可以設定"列高"嗎???
  回复  引用    
2007-07-23 09:41 | liaojumin [未注册用户]
老大,使用您的方法填写带有自动生成条形码功能的PDF文件时有下面的问题:
1。英文可以正常显示,中文必须在该具体文本框霍去焦点后才能显示出来;
2。不关英文中文条形码都没有自动生成。(就是为了生成条形码才要通过代码填写这表单)
不知道您过去有没有谈到过这个问题,itext能否解决,小弟笨拙没有找到相关内容。先感谢赐教!
  回复  引用    
#49楼 [楼主]
2007-07-23 11:54 | HardRock      
@liaojumin
第一个可能是你字体设置问题,如果你使用英文字体,中文自然无法正常显示

第二个问题我没有看明白你的意思

条码你是用字体实现还是用iTextSharp自带的编码实现(如果填表的方式,恐怕只能用字体实现了),如果字体不存在你怎么处理(填表机器是否有你希望的字体)?
  回复  引用  查看    
2007-07-24 18:43 | liaojumin [未注册用户]
非常感谢您这么快的回复,第一个问题嘛,或许我该再仔细试试其他字体,可是奇怪的是当我使用同样的程序同样的字体填写从贵网站上下载的那个demo.pdf文件时,中文也能显示正常,这个我上次忘说了。
第二个问题指的是PDF文件中有多个二维条形码控件,当手动往表单里填写资料时,条形码自动生成。然而使用程序填写的时候,即使全部使用英文(不考虑中文的影响),填写后打开,所有英文填写资料正常,可是条形码没有自动生成。而这个条形码自动生成的功能却是最重要的。

或者贴上代码吧:
using System;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

public class Chap1007
{

public static void Main()
{
//如果不使用CID字体,下面三行不需要
BaseFont.AddToResourceSearch("iTextAsian-1.0.dll");
BaseFont.AddToResourceSearch("iTextAsianCmaps-1.0.dll");
BaseFont font = BaseFont.CreateFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);

PdfReader reader = new PdfReader("IMM5257B2007-06-25.pdf");

PdfStamper stamp1 = new PdfStamper(reader, new FileStream("registered.pdf",FileMode.Create));

AcroFields form1 = stamp1.AcroFields;

//以下为填写表单部分
form1.SetField("fam_name_ap", "填写中文表单","填写中文表单");
form1.SetField("fam_name_dep1", "填写中文表单1");
form1.SetField("fam_name_dep2", "填写中文表单2");
form1.SetField("fam_name_dep3", "填写中文表单3");
stamp1.Close();
}
}

  回复  引用    
#51楼 [楼主]
2007-07-24 18:54 | HardRock      
第一,你BaseFont.CreateFont 的字体和你PDF的字体要一致,或者你通过代码修改PDF的字体与BaseFont.CreateFont 的字体一致

第二,你还是没有回答我的问题,你条码用的是字体文件吧,你的字体文件是否BaseFont.CreateFont

这段代码中BaseFont.CreateFont 的意义就是将你要用的字体加入到字体列表中(也许是这么说,好久没有看代码有些忘记了)。
  回复  引用  查看    
2007-07-24 18:55 | liaojumin [未注册用户]
有需要的话,小弟可以把那个PDF文件发给您看看,只是不知道怎么发。
我知道您对itext很有研究,了解甚深,期望您能给个办法解决,若是itext解决不了也不胜感激。
  回复  引用    
2007-07-24 19:35 | liaojumin [未注册用户]
第一个问题通过修改字体达到一致确实能够正常显示,非常感谢!
第二个问题,那个PDF文件不是我做的,而且也不太熟悉,只看到条码和其他表单一样使用"Helvetica"字体
  回复  引用    
#54楼 [楼主]
2007-07-24 22:03 | HardRock      
发pdf到rocsky(#)gmail
  回复  引用  查看    
2007-07-25 12:11 | liaojumin [未注册用户]
老大,PDF文件已经发送到您的gmail邮箱了。
  回复  引用    
#56楼 [楼主]
2007-07-25 13:48 | HardRock      
对Barcode Field不了解,需要研究下。
Barcode Field的值是算出来的
  回复  引用  查看    
2007-07-25 16:54 | liaojumin [未注册用户]
是啊,确实是一件有点麻烦的事啊!可是有老大帮忙,安心多了,呵呵。
  回复  引用    
2007-08-08 10:45 | hersion [未注册用户]
HardRock大大您好:拜讀您的文章已好一陣子了,目前遇到一個問題,想請問您,要麻煩您了,謝謝!
目前我使用HTMLWorker的方式,將html轉成pdf,但中文字一直轉不出來,程式碼如下,不知要如何才可將中文字顯示呀???
以上麻煩您了,謝謝。


Dim sBuff As New StringBuilder("<html>")
sBuff.Append("<head></head>")
sBuff.Append("<body>")
sBuff.Append("<table border=1>")
sBuff.Append("<tr><td><font color='red'>背景背景Test worker背景</font></td></tr>")
sBuff.Append("</table>")
sBuff.Append("</body>")
sBuff.Append("</html>")
Dim document As New Document()

Dim helv As BaseFont = BaseFont.CreateFont("C:\WINDOWS\Fonts\SIMHEI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED)
Dim iFont As Font = New Font(helv, 12)
Dim para As Paragraph = New Paragraph("", iFont)

Dim worker As New iTextSharp.text.html.simpleparser.HTMLWorker(document)
Dim stringReader As New StringReader(sBuff.ToString())
Dim pdfWriter As PdfWriter = pdfWriter.GetInstance(document, New FileStream("c:\pdf\test0.pdf", FileMode.Create))
document.Open()
Dim p As ArrayList = iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(stringReader, Nothing)
For k As Integer = 0 To p.Count() - 1
para.Add(DirectCast(p(k), IElement))
Next

document.Add(para)
document.Close()
  回复  引用    
#59楼 [楼主]
2007-08-13 16:38 | HardRock      
@hersion
希望看了这段代码后,不用我解释你就能明白其中的原因。

Dim sBuff As New StringBuilder("<html>")
sBuff.Append("<head></head>")
sBuff.Append("<body>")
sBuff.Append("<font color='red'>背景背景Test worker背景</font>")

sBuff.Append("<table border=1>")
sBuff.Append("<tr><td><font color='red' size='30' face='Gulim'>背景背景Test worker背景</font></td></tr>")
sBuff.Append("</table>")
sBuff.Append("</body>")
sBuff.Append("</html>")
Dim document As New Document

Dim style As StyleSheet = New StyleSheet
style.LoadTagStyle("td", "face", "Gulim")
style.LoadTagStyle("td", "encoding", "Identity-H")
style.LoadTagStyle("td", "leading", "12,0")

style.LoadTagStyle("body", "face", "SIMHEI")
style.LoadTagStyle("body", "encoding", "Identity-H")
style.LoadTagStyle("body", "leading", "12,0")

FontFactory.RegisterDirectory("c:\Windows\Fonts")

'Dim helv As BaseFont = BaseFont.CreateFont("c:\Windows\Fonts\SIMHEI.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED)
'Dim iFont As Font = New Font(helv, 12)
Dim selector As New FontSelector
selector.AddFont(FontFactory.GetFont("Gulim", BaseFont.IDENTITY_H, False, 10))




Dim para As Paragraph = New Paragraph(selector.Process("字体选择")) ' New Paragraph("", iFont)

Dim worker As New iTextSharp.text.html.simpleparser.HTMLWorker(document)
Dim stringReader As New StringReader(sBuff.ToString())

Dim pdfWriter As PdfWriter = pdfWriter.GetInstance(document, New FileStream("c:\test0.pdf", FileMode.Create))
document.Open()
Dim p As ArrayList = iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(stringReader, style)
For k As Integer = 0 To p.Count() - 1
para.Add(DirectCast(p(k), IElement))
Next

document.Add(para)
document.Close()
  回复  引用  查看    
2007-08-16 17:05 | Ken [未注册用户]
HardRock大侠你好,本来不想打扰你老人家,不过没办法,在网在搜完了也找不到答案,只能来请教你,最近手头做的东西有关pdf的,用了iTextSharp,同于单元格里面有图片和文字分行排版,想来想去只想把html转pdf啦,但css不起作用,请问在iTextSharp怎么应用CSS

好像这一句:
<div style='BORDER-RIGHT:1px solid; BORDER-TOP:1px solid; BORDER-LEFT:1px solid; WIDTH:180px; BORDER-BOTTOM:1px solid'>

那些样式根本不起作用,请问是怎么一回事
  回复  引用    
#61楼 [楼主]
2007-08-16 17:11 | HardRock      
@Ken
css你需要另外找控件来解析了

我英文blog(http://blog.rubypdf.com)上倒是介绍了个java的解决方案,.net的我也没有
  回复  引用  查看    
2007-08-21 13:17 | nkight [未注册用户]
问个与本文无关的问题:怎么才能注册epubcn呢?注册时需要的所谓邀请码,如何获取?我的邮箱:sun_shine_way@yahoo.com.cn
  回复  引用    
2007-08-30 10:31 | HardRock大仙:我现在遇到一个问题,放到CSDN上好几天了没人来解决,我只好来请您老人家出山一 [未注册用户]
protected void Button1_Click(object sender, EventArgs e)
{
dtb = (DataTable)Session["List"];
CreatePDFheader(Server.MapPath("/pdf/1.pdf"), Server.MapPath("/images/logo-binhon2.gif"), "PDF页脚");
TableToPDF.ConvertDataTableToPDF(dtb, Convert.ToString(Server.MapPath("/pdf/1.pdf")), Convert.ToString("C:\\WINDOWS\\Fonts\\simsun.ttc,1"), 12);
}

现在这个函数里面调用的两函数,但使终只有一个函数执行成功.
问题是:注释掉函数TableToPDF.ConvertDataTableToPDF()时,CreatePDFheader()就能执行成功(只生成PDF出现页眉和页脚),如果加上函数TableToPDF.ConvertDataTableToPDF()时,就只有函数ConvertDataTableToPDF()执行成功(只生成数据表的内容).

我想这个问题是原因是://注意FileMode-Create表示如果目标文件不存在,则创建,如果已存在,则覆盖。
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(PDFFilePath, FileMode.Create));
不知可能不可以追加解决这个问题,我不知要怎么解决了.请HardRock大仙出山了.
  回复  引用    
#64楼 [楼主]
2007-08-30 10:50 | HardRock      
@HardRock大仙:我现在遇到一个问题,放到CSDN上好几天了没人来解决,我只好来请您老人家出山一
你的两个方法可以合并一起,使用IPdfPageEvent
iTextSharp生成的PDF显示“Page X of Y”的效果,IPdfPageEvent的应用一例
http://www.cnblogs.com/hardrock/archive/2005/11/16/277417.html

当然你可以分开写,这时候你把两个方法掉换一下,先执行TableToPDF.ConvertDataTableToPDF,然后执行CreatePDFheader,在CreatePDFheader方法中应该是用PdfReader打开TableToPDF.ConvertDataTableToPDF生成的PDF(随便你是Stream,Byte或者文件),然后用PdfStamper来实现添加Header,至于PdfStamper的使用,你参考下这篇文章的相关内容吧

btw, 我不是大仙,是食人间烟火的人,也在忙于生计。
  回复  引用  查看    
2007-08-30 10:55 | HardRock大仙:我现在遇到一个问题,放到CSDN上好几天了没人来解决,我只好来请您老人家出山一 [未注册用户]
谢谢,谢谢!我马上试.
你是有中国特色的且食人间烟火的大仙!
  回复  引用    
2007-08-30 14:53 | HardRock大仙:我现在遇到一个问题,放到CSDN上好几天了没人来解决,我只好来请您老人家出山一 [未注册用户]
大仙啊.我太菜了
我现在就想请你想个办法把"FileMode-Create表示如果目标文件不存在,则创建,如果已存在,则覆盖。"
里面的FileMode.Create换成可以追加的就好了.

protected void Button1_Click(object sender, EventArgs e)
{
dtb = (DataTable)Session["List"];
TableToPDF.ConvertDataTableToPDF(dtb, Convert.ToString(Server.MapPath("/pdf/4.pdf")), Convert.ToString("C:\\WINDOWS\\Fonts\\simsun.ttc,1"), 12);
CreatePDFheader(PdfReader.LZWDecode(Server.MapPath("/pdf/4.pdf")), Server.MapPath("/images/logo-binhon2.gif"), "PDF页脚");
}

请你看看这部分代码,帮我心改一下.
  回复  引用    
#67楼 [楼主]
2007-08-30 16:08 | HardRock      
@HardRock大仙:我现在遇到一个问题,放到CSDN上好几天了没人来解决,我只好来请您老人家出山一

你只给了我两个方法的调用,让我猜测你的方法怎么写,怎么实现的吗?
我已经把思路告诉你了
我不明白你的创建或者覆盖什么意思?
  回复  引用  查看    
2007-08-30 17:42 | HardRock大仙:我现在遇到一个问题,放到CSDN上好几天了没人来解决,我只好来请您老人家出山一 [未注册用户]
我是在网上看了 http://pdfhome.hope.com.cn/Article.aspx?CID=bf51a5b6-78a5-4fa3-9310-

16e04aee8c78&AID=0d9c1524-64a2-4dd2-b26f-930687949eb1 然后根据PDF之家(里面的代码我全到COPY到我的页面里里,因为我刚想一下子全发上来,博客限制发很多内容上面,没办法我只好给您说这个地址)的说法将代友放到我的项面

中,稍稍改了一下居然能生成PDF格式的文件,但出现的问题就是:
现在这个函数里面调用的两函数,但使终只有一个函数执行成功.
protected void Button1_Click(object sender, EventArgs e)
{
dtb = (DataTable)Session["List"];
TableToPDF.ConvertDataTableToPDF(dtb, Convert.ToString(Server.MapPath("/pdf/4.pdf")), Convert.ToString("C:\\WINDOWS\\Fonts\\simsun.ttc,1"), 12);
CreatePDFheader(PdfReader.LZWDecode(Server.MapPath("/pdf/4.pdf")), Server.MapPath("/images/logo-binhon2.gif"), "PDF页脚");
}
}
问题是:注释掉函数TableToPDF.ConvertDataTableToPDF()时,CreatePDFheader()就能执行成功(只生成PDF

出现页眉和页脚),如果加上函数TableToPDF.ConvertDataTableToPDF()时,就只有函数

ConvertDataTableToPDF()执行成功(只生成数据表的内容). -------我在上面提的就是这个问题.

我想这个问题是原因是://注意FileMode-Create表示如果目标文件不存在,则创建,如果已存在,则覆盖。
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(PDFFilePath,

FileMode.Create));
  回复  引用    
2007-08-30 22:53 | HardRock大仙:我现在遇到一个问题,放到CSDN上好几天了没人来解决,我只好来请您老人家出山一 [未注册用户]
我的MSN:wd3w@163.com请大仙亲自即时指导!
万分感谢!老板催急了
  回复  引用    
2007-10-27 22:14 | 最后一只恐龙 [未注册用户]
有如下需求:
(1)生成的PDF要加第几页和共几页,但封面不加,封面之后是第1页,总页数不能计算封面。
(2)内容中有很多表格,表格的行数可能很多,也就是分页是自动的,而不是调用NewPage()增加新页。

这样的需求如何处理,望给点思路,不胜感激。
  回复  引用    
#71楼 [楼主]
2007-10-28 10:02 | RubyPDF      
第一个需求,我blog里有相关文章。
http://www.cnblogs.com/hardrock/archive/2005/11/16/277417.html

第二个需求,使设置table的属性。
从这个例子中应该可以找到答案吧
http://www.codeproject.com/useritems/iTextSharpPdfTables.asp


  回复  引用  查看    
2007-11-02 11:29 | 最后一只恐龙 [未注册用户]
万分感谢搂主的回复,我试一下。

前段时间企图使用FitsPage()计算可增加行数,然后用NewPage()分页,但遇到一个问题,怀疑是dll的bug。我做的测试例子第一列为跨多行的,具体如下:
(1)new一个Table,列数为4。
(2)增加一列,rowspan=n
(3)循环增加行,每行3格
(4)如果FitsPage返回false,则删除最后增加的Rowspan跨度内的行。比如填了m行(m<n)后发现超出本页了,则删除这m行,增加一个跨度为m-1的列,再增加m-1行(每行3格)。

出现的问题是,循环调用DeleteLastRow,可以从后面删除行,但那个Rowspan=n的单元格总是删不掉,假设它在第x行,则再增加单元格时,出现(x,1)位置不能加入的错误,实际应该是(x,0)位置才对。

呵呵,不知道说清楚了没有。