posts - 194,  comments - 1484,  trackbacks - 6
   
    越来越多的人来信或者留言(甚至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 阅读(31887) 评论(248) 编辑 收藏

FeedBack:
评论共3页: 上一页 1 2 3 
2008-04-29 16:25 | 高[未注册用户]
请问CJKFONT源代码中提到cjkfonts.properties的引用?
可是我在最新下载的源代码中并没有找到cjkfonts.properties这个文件。
导致含有四字节冷僻字的字符串被PdfContentByte.SHOWTEXT过滤掉。从而四字节汉字无法嵌入到PDF中。


因为没有找到cjkfonts.properties,所以含有四字节汉字的字库被当成普通汉字库进行处理了,而类似0XD840DC00的四字节汉字被分成两个进行CMAP映射,当然返回值为空了!!
这个问题如何解决?

因为 internal byte[] ConvertToBytes(string text) {函数在转换含有四字节字符串过程中,
int len = text.Length;//长度是以两个字节为单位的;得到的长度不对,因为四字节多占两个字节,也就是长度会多1个字符。
而这里误认为多一个字符是不对的。
0XD840DC00是一个扩展B汉字,而 text.Length认为是两个字符。
而这个进行CMAP映射是错误的:
metrics = ttu.GetMetricsTT(c);0XD840当然无法返回对应的映射了!
if (metrics == null)
continue;
ttu.GetMetricsTT(c);

 回复 引用   
#151楼[楼主]
2008-04-29 16:39 | RubyPDF      
@高
你需要额外下载
iTextAsian-1.0.dll
iTextAsianCmaps-1.0.dll
cjkfonts.properties在iTextAsian-1.0.dll 中,但这个并不是你所需要的
你需要的东西应该在iTextAsianCmaps-1.0.dll

 回复 引用 查看   
#152楼[楼主]
2008-04-29 16:48 | RubyPDF      
@高
你bsongs是怎么定义的,怀疑你bsongs定义有问题

 回复 引用 查看   
2008-04-29 17:19 | 高[未注册用户]
BaseFont bsongs = BaseFont.CreateFont(@"C:\WINDOWS\Fonts\SurSong.TTF",
BaseFont.IDENTITY_H, BaseFont.EMBEDDED);//设置宋体-方正超大字符集
然后传入str,进行跟踪,发现:
int len = text.Length;
metrics = ttu.GetMetricsTT(c);0XD840当然无法返回对应的映射了!
if (metrics == null)

=======================
UNICODE定义BMP中四字节扩展B汉字的D800-DFFF为代理区(SurrogateZone),

//其中D800-D8FF为高半代理(highsurrogate),DC00-DFFF为低半代理(lowsurrogate)。

//从两个区域分别取一个编码,组成一个4字节的代理对来表示一个编码字符,

//此即为UTF-16.

//例如对于扩展B四字节特殊处理:UTF16编码为:0XD840DC00,

//记事本实际存储的时候顺序依次是40 D8 00 DC,对应的UCS-4为0X20000




 回复 引用   
2008-04-29 17:46 | 高[未注册用户]
我的QQ:45633130
谢谢!

我用的WINDOWS系统中OFFICE中自带的宋体-方正超大字符集,TTF字库。
也要在C3程序中引用:
BaseFont.AddToResourceSearch(MapPath(@".") + "iTextAsian-1.0.dll");
BaseFont.AddToResourceSearch(MapPath(@".") + "iTextAsianCmaps-1.0.dll");
吗?

字符串存储四字节的时候跟踪发现就是以40 D8 00 DC四个字节依次进行存储的。因此想str传入ShowText(str);
就被过认为是两个双字节汉字进行处理给滤掉了!因为没有40 D8 或者00 DC的双字节字符。

UNICODE基本汉字4E00-9FA5,扩展A是3400-4DB5。
KZB的UCS-4是20000-2A6D5,换算成UTF16就是0XD840DC00系列。

 回复 引用   
2008-04-29 18:25 | 高[未注册用户]
iTextAsian-1.0中的CMAP都是UCS2命名的,也就是说仅支持双字节字符映射?

汉字UNICODE扩展B区在UNICODE二平面,
记事本存储的时候采用四字节存储。
因为UCS2只能放65535个字符,
KZB汉字2万多20000-26AD6,如何与
汉字“𠀀”的UNICODE编码表示是”U+20000”,但其记事本对应的存储和交换表示则是:0XD840DC00.

有这样的二平面汉字到字形GLYPH的CMAP映射表吗?
======================
UCS有两种格式:UCS-2和UCS-4。顾名思义,UCS-2就是用两个字节编码,UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码。

UCS-2有2^16=65536个码位,UCS-4有2^31=2147483648个码位。

UCS-4根据最高位为0的最高字节分成2^7=128个group。每个group再根据次高字节分为256个plane。每个plane根据第3个字节分为256行 (rows),每行包含256个cells。当然同一行的cells只是最后一个字节不同,其余都相同。

group 0的plane 0被称作Basic Multilingual Plane, 即BMP。或者说UCS-4中,高两个字节为0的码位被称作BMP。

将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。在UCS-2的两个字节前加上两个零字节,就得到了UCS-4的BMP。



 回复 引用   
2008-04-30 09:55 | 高[未注册用户]
对于UNICODE编码的WINDOWS TTF字库,不用iTextAsianCmaps,也是可以直接在PDF输入双字节汉字的.
我经过试验是可以,
指定系统下的中文字库就可以。
使用
BaseFont bsongs = BaseFont.CreateFont(@"C:\WINDOWS\Fonts\SurSong.TTF",
BaseFont.IDENTITY_H, BaseFont.EMBEDDED);//设置宋体-超大字符集
pDC.SetFontAndSize(bfhei, 5.6f/25.4f*72);
pDC.BeginText();
pDC.ShowText(“中国㐀”); 等,就可以在PDF中显示和打印这些中文。
pDC.ENDText();

现在的问题是,ITEXT的BASEFONT的internal Hashtable ReadFormat4()
在某个TTF字库CMAP表的时候仅仅读到双字节代码到字型的索引,没有读到后面的二平面代码的映射。
即TTF字库中的双字节
141. Char 0000FFE0 -> Index 28663
Char 0000FFE1 -> Index 28664
Char 0000FFE2 -> Index 28665
Char 0000FFE3 -> Index 28666
Char 0000FFE4 -> Index 28667
Char 0000FFE5 -> Index 28668,读到这里完毕。


而扩展B编码UNICOE二平面没有进行自动读取:
142. Char 00020000 -> Index 28669
Char 00020001 -> Index 28670
Char 00020002 -> Index 28671
Char 00020003 -> Index 28672
Char 00020004 -> Index 28673
Char 00020005 -> Index 28674
143. Char 00020007 -> Index 28675
Char 00020008 -> Index 28676
Char 00020009 -> Index 28677
Char 0002000A -> Index 28678
Char 0002000B -> Index 28679
这个没有读取到CMAP31哈希表表里面。!!
而我们恰恰需要类似Char 00020000 -> Index 28669的2万多二平面汉字的显示。

对于您所说的iTextAsianCmaps对于WINDOWS OFFICE自带的方正宋体-超大超大字符集具体如何使用呢?
我有这个字库的CMAP映射,可是如何转换您iTextAsianCmaps中的那种格式呢?
字库名又是如何规定呢?
原先是这样规定的:BaseFont bsongs = BaseFont.CreateFont(@"C:\WINDOWS\Fonts\SurSong.TTF",
BaseFont.IDENTITY_H, BaseFont.EMBEDDED);//设置宋体-超大字符集
对于含有例如20000二平面映射汉字的宋体-超大字符集.TTF字库
如何使用iTextAsianCmaps格式呢?
非常感谢!




 回复 引用   
2008-05-09 20:01 | protectPdf[未注册用户]
请问老大,如果我想通过pdfreader将pdf的内容读出来显示在.net的控件中(比如说textbox),该怎么办?因为读出来的是byte[]形式的,怎样转换?
我本意是想对pdf进行权限控制,比如说控制复制,打印,打开次数,所以想把pdf内容读出来然后显示在自己的控件中,以便控制.您有什么建议?

 回复 引用   
#158楼[楼主]
2008-05-09 21:47 | RubyPDF      
@protectPdf
另外想出路吧,iTextSharp的PdfReader没有你想要的功能。

 回复 引用 查看   
2008-05-11 09:27 | protectPdf[未注册用户]
@RubyPDF
感谢您这么即使的回复.您知道那个pdf clown吗?还有 pdfbox?这量\两个哪个能实现我的想法?谢谢

 回复 引用   
#160楼[楼主]
2008-05-12 11:00 | RubyPDF      
@protectPdf
恐怕都不行。

 回复 引用 查看   
2008-05-12 11:53 | showmi[未注册用户]
RubyPDF 老大,我刚刚接触 iTextSharp,我下载的是4.1.1,但运行你写的那个example教程,运行不起,有好多类或命名空间在4.1.1里找不到啊,郁闷啊.

 回复 引用   
#162楼[楼主]
2008-05-12 12:04 | RubyPDF      
@showmi
不好意思,教程太老了,好久没有更新了。

 回复 引用 查看   
2008-05-12 12:21 | showmi[未注册用户]
谢谢RubyPDF 老大,有没其它什么新例子啊,我现在的需求也挺简单,就是把html表单包括CSS样式转换成PDF.PDF可能有很多页.可以用itextSharp实现不?如果有这方面的例子希望老大发送到我的E_Mail:showmi168@sohu.com,不甚感激.附:老大如果有空可以更新下example.今天感觉itextsharp真是个好东东.想学啊.
 回复 引用   
#164楼[楼主]
2008-05-12 12:25 | RubyPDF      
@showmi
你的需求真不简单,是你自己想简单了。
html转PDF,哪里有那么好实现的。

 回复 引用 查看   
2008-05-12 12:28 | showmi[未注册用户]
itextsharp现在的功能是可以实现html转PDF吗?
 回复 引用   
#166楼[楼主]
2008-05-12 12:29 | RubyPDF      
@showmi
部分Tag而已。

 回复 引用 查看   
2008-05-12 12:42 | showmi[未注册用户]
哎,看来只能花钱钱第三方组件那.希itextsharp早日完善.谢谢RubyPDF老大.
 回复 引用   
#168楼[楼主]
2008-05-12 12:47 | RubyPDF      
@showmi
iTextSharp是很强大,但它定位于底层的实现,具体某种特定功能的实现往往需要自己来研究了。

 回复 引用 查看   
2008-05-12 12:53 | showmi[未注册用户]
恩,好的,仔细研究下,谢谢RubyPDF老大.
 回复 引用   
2008-05-19 16:29 | showmi[未注册用户]
RubyPDF老大,上周问你的那个html转pdf,问完一个小时,就发生地震,现在脑壳都是晕的,不知道怎么做啊.郁闷啊.(我在成都,现在心还是120/m).
 回复 引用   
2008-05-23 20:06 | zzg[未注册用户]
我基本是照搬您的代码,但还是出现了如下问题:异常详细信息: System.IO.IOException: 文件“e:\tmp0.pdf”正由另一进程使用,因此该进程无法访问该文件。
实在是没办法了,不知您能否指点一下,谢谢.

 回复 引用   
#172楼[楼主]
2008-05-25 23:22 | RubyPDF      
@zzg
方便贴出你的代码。

 回复 引用 查看   
2008-05-28 12:05 | 徐[未注册用户]
请教!请指点一下!不胜感激!
iText 怎么读取文本? itext能不能得到PDF中的code39码??

 回复 引用   
#174楼[楼主]
2008-05-28 12:08 | RubyPDF      
@徐
iTextSharp本身不支持的
另外barcode有两种方式,图片(位图)和画线条(矢量图)的方式。

 回复 引用 查看   
2008-05-28 13:21 | 徐[未注册用户]
--引用--------------------------------------------------
RubyPDF: @徐
iTextSharp本身不支持的
另外barcode有两种方式,图片(位图)和画线条(矢量图)的方式。
--------------------------------------------------------
请问barcode的这两种方法是“得到”吗? 是从PDF中提取条形码吗?能说一下怎么得到吗? 我得不到,只能创建!麻烦您帮下忙,谢谢!

 回复 引用   
#176楼[楼主]
2008-05-28 13:27 | RubyPDF      
@徐
我没有说清楚,是生成,不是获得。

 回复 引用 查看   
2008-05-28 13:32 | 徐[未注册用户]
@RubyPDF
谢谢 那您知道获取条形码的方法吗?我弄了好几天了,我实在是没法了!谢谢!

 回复 引用   
2008-06-17 14:16 | 求知无傲      
mark
 回复 引用 查看   
2008-07-09 14:21 | hdjdchen[未注册用户]
我在使用iTextSharp 插入一张wmf文件的时候,发现wmf上的汉字显示为乱码(已经添加了字体),插入其它文本的时候,显示正确,请问怎样能够解决这个问题呢,急需解决。。。。
 回复 引用   
#180楼[楼主]
2008-07-11 11:06 | RubyPDF      
@hdjdchen
请提供wmf。

 回复 引用 查看   
2008-07-15 17:07 | yzq[未注册用户]
您好,请教一下
我现在做的PDF需要根据页码来改变页边距,
就是偶数页的时候靠右一些,奇数页靠左一些,
不知道有没有办法解决,
楼主帮忙一下,不胜感激。

 回复 引用   
#182楼[楼主]
2008-07-15 18:01 | RubyPDF      
@yzq
这个要分你是新创建还是处理已生成的PDF
如果是新创建是自动适用document.newPage(),还是代码调用newPage控制
这些都要说清楚。

 回复 引用 查看   
2008-07-16 13:31 | Paddycai      
我需要把ppt,text,rtf,doc等大量文件转换成pdf,利用iTextSharp实现有一定难度,请大侠赐教。
 回复 引用 查看   
#184楼[楼主]
2008-07-16 13:46 | RubyPDF      
@Paddycai
你还是另外找控件吧,或者用虚拟打印机,或者OpenOffice,iTextSharp实现这些功能,如果我有这本身,我都发了。

 回复 引用 查看   
2008-07-16 13:56 | Paddycai      
@RubyPDF
我需要程序自动监控一个文件夹,当里面有新文件时就转成pdf文件并保持格式不变,OpenOffice可以实现此功能么?虚拟打印机好像只是在 打印设置时把文件另存为pdf,这不能满足我 批量文件转换的需求。有没有更好的方法?adobe 的sdk虽然可以,但貌似需要20000$,比较昂贵啊!

 回复 引用 查看   
#186楼[楼主]
2008-07-16 13:59 | RubyPDF      
@Paddycai
我给你参考方案了,你还问我可以吗?我怎么回答你呢?我是回答可以,还是不可以?

 回复 引用 查看   
2008-07-17 18:21 | everypdf[未注册用户]
段落或短句或块,哪儿设置字符间的间距,实在是找不着,望楼主提醒。
 回复 引用   
2008-09-18 10:22 | dddsss[未注册用户]
段落或短句或块,哪儿设置字符间的间距,实在是找不着,望楼主提醒。
--------------------------------------------
我也一样,遇到这个问题。目前只有做个循环,计算字符位置,一个一个显示。望楼主提醒。

 回复 引用   
2008-10-03 10:28 | 李易[未注册用户]
楼主
您好!
麻烦您请教一下:document.addtitle("这里是中文")
生成的PDF属性的Title字段里全是乱码,楼主知道怎么解决吗?PDF正文是好好的,非常感谢!!

 回复 引用   
2008-10-10 11:39 | 迷茫人[未注册用户]
楼主你好:
参照Chap0703例子,用xml生成pdf,但是怎么解决中文的问题呢?
在tagmap0703中加入:
<tag name="iTextSharp.text.pdf.BaseFont" alias="sunti">
<attribute name="family" value="iTextSharp.text.pdf.BaseFont.CreateFont(@C:\Windows\Fonts\SIMYOU.TTF, BaseFont.IDENTITY_H, BaseFont.EMBEDDED)"/>
<!--<attribute name="family" value="SIMYOU.TTF"/>-->
<attribute name="size" value="18"/>
<!--<attribute name="style" value="iTextSharp.text.Font.NORMAL"/>-->
<attribute name="style" value="NORMAL"/>
</tag>

在chap0703中加入:
<sunti>中文测试</sunti>
结果显示不出来。请问tag中应该怎么定义,因为对xml不是很熟。谢谢指导。

 回复 引用   
2008-10-14 09:25 | 永恒      
HardRock:
你這種方式填充後的PDF表單都是不能再編輯的了,能有什麼法子讓自動填充後的PDF表單還能繼續修改嗎?

 回复 引用 查看   
#192楼[楼主]
2008-10-14 09:36 | RubyPDF      
@永恒
可以的,你别把Field都flatten就可以了。

 回复 引用 查看   
#193楼[楼主]
2008-10-14 09:37 | RubyPDF      
@迷茫人
这个例子在新版本的iTextSharp下已经有些老了,你看下htmlwork的应用吧。

 回复 引用 查看   
2008-10-14 10:02 | 永恒      
@RubyPDF
哈哈,果然成功了,非常感謝!看來程序有時候還是要多動手去測試一下,才能知道其中奧妙.

 回复 引用 查看   
2008-10-17 12:01 | Need Help[未注册用户]
BaseFont.AddToResourceSearch(Application.StartupPath & "/iTextAsian-1.0.dll")
BaseFont.AddToResourceSearch(Application.StartupPath & "/iTextAsianCmaps-1.0.dll")
BF = BaseFont.CreateFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED)

请问为何我照着上面的做,可以输出pdf,。。虽然总页数是正确。。但内是空白。。什么都不显示。。包括表格。。

如果我直接用物理路徑載入中文字体,必须是OpenType才正确,用TrueType的话,就会显示类似 Font xxx with 'IDENTITY_H' is not recognized. 的錯誤。。。

求救。。謝謝。

 回复 引用   
2008-10-17 13:35 | Need Help[未注册用户]
对不起,上面描述有点点错误。请看下面的描述。。不好意思。
--引用--------------------------------------------------
Need Help: BaseFont.AddToResourceSearch(Application.StartupPath &amp; &quot;/iTextAsian-1.0.dll&quot;)
BaseFont.AddToResourceSearch(Application.StartupPath &amp; &quot;/iTextAsianCmaps-1.0.dll&quot;)
BF = BaseFont.CreateFont(&quot;STSong-Light&quot;, &quot;UniGB-UCS2-H&quot;, BaseFont.EMBEDDED)

请问为何我照着上面的做,可以输出pdf,。。虽然总页数是正确。。但内是空白。。什么都不显示。。包括表格。。

如果使用绝对路径来载入字体,有什么好的办法列出系统已有的中文字体给用户选择吗?

求救。。謝謝。
--------------------------------------------------------

 回复 引用   
2008-12-18 10:08 | 浮云的等待      
留个脚印,以后还要多向lz学习
 回复 引用 查看   
2008-12-19 17:39 | hcsang[未注册用户]
楼主,你好。
向Form中的文本域中填充值,已从楼主的文章中的到解决,谢谢。
但,对于Form中图像域的填充却不知如何做。
AcroFields提供的SetField方法,接口中的Value是string型的。
赋值为 图片的路径时不可以。

请教,谢谢。

 回复 引用   
#199楼[楼主]
2008-12-19 17:41 | RubyPDF      
@hcsang
未研究,不清楚,可以考虑用图片覆盖相关field吧?

 回复 引用 查看   
2009-01-16 14:42 | jameson[未注册用户]
楼主大哥。。。。
你可以把下面这个DLL发给我吗?
iTextAsian-1.0.dll
iTextAsianCmaps-1.0.dll
我在这先感谢你了!

谢谢。。。。


 回复 引用   
2009-02-11 13:02 | Fank[未注册用户]
请问用iTextSharp是否能够将变形的文字输出到PDF中?
 回复 引用   
#203楼[楼主]
2009-02-12 15:56 | RubyPDF      
@Fank
不是很清楚你的需求

 回复 引用 查看   
2009-02-12 19:27 | KenLee[未注册用户]
楼主大侠,

有个问题我请教你的,真的困扰我很久了,希望你能帮到我.

我有一个PDF模板,然后用Adobe Acrobat pro弄了一张表单,例如说,一些Textfeild啦.现在的情况是我会先读出这个模板,然后用中文填充那些文本框(已经成功了),然后还有一些文本框让用户填写,最后让用户提交到我写的Servlet处理.

但现在问题就出现了,无论我是用HTML或者XML格式提交,在Servlet得到总是会乱码,请问楼主有什么例子可以解决提交中文表单的吗?在PDF解决或者在servlet上解决都可以.

如果您有解决方法,请QQ:286311067或者E-mail: leejy8592@163.com

现在好急切,如果有解决方法,请早点告诉我,万分感激.

 回复 引用   
#205楼[楼主]
2009-02-15 20:49 | RubyPDF      
@KenLee
很抱歉,我没有写过java的实现,所以没法回答你的问题,很抱歉。

 回复 引用 查看   
2009-02-20 09:44 | ttk[未注册用户]
请问用iTextSharp是否能够将变形的文字输出到PDF中?

-----------------------------------
同问,iTextSharp是否支持中文字符的缩放,纵向缩放横向缩放之类

 回复 引用   
2009-02-22 17:12 | BigLee.cn[未注册用户]
博主,您好!
  最近我也在ASP.net(C#)中用iTextSharp来处理pdf,经过收集资料,在摸索中熟悉,基本上我需要的功能都能实现了。
  现在碰到一个难题,就是我需要绝对定位pdf中的对象。我所了解的方法就是使用PdfContentByte,然后用ShowTextAligned来在指定位置呈现文字,但是,我找不到给文字指定粗体和斜体等样式的方法。
  望指点一二。谢谢!

附我显示文本的代码:
Document doc = new Document(new iTextSharp.text.Rectangle(564, 351));
PdfWriter writer= PdfWriter.GetInstance(doc, new FileStream(HttpContext.Current.Server.MapPath("1.pdf"), FileMode.Create));
doc.Open();
PdfContentByte cb = writer.DirectContent;
cb.BeginText();
BaseFont bfont = BaseFont.CreateFont(@"c:\windows\fonts\SIMHEI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//设定字体:黑体
cb.SetFontAndSize(bfont, 18);//设定字号
cb.SetCharacterSpacing(1);//设定字间距
cb.SetRGBColorFill(66, 00, 00);//设定文本颜色
cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, "在位置100,70处开始显示文本", 100, 70,0);
cb.EndText();
doc.Close();

 回复 引用   
2009-03-01 19:15 | 小乞丐熊之.NET家园      
請問大俠,這問題困擾我好久了。
我用iTextSharp在程序裡讀PDF檔,然後再插入一張圖片,就這麼簡單,居然會有問題!
現象是插入圖片後每頁顯示的是橫向的了, 一律向左橫向!

這種現象對於一些PDF檔存在,不是全部的,有些PDF檔是正常的(比如說是用什麼軟件導出來的,但也不是絕對),
不正常的一般是從掃描儀中掃出來的,打上圖片後幾乎全是橫向,原始檔是沒問題的。代碼如下:


iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(tmpPicture); //tmpPicture為圖片目錄
img.SetAbsolutePosition(0, 0);
try
{
PdfReader reader = new PdfReader(file); //file為原始pdf檔地址
int n = reader.NumberOfPages;
iTextSharp.text.Rectangle psize = reader.GetPageSize(1);
float width = psize.Width;
float height = psize.Height;

Document.Compress = true;
Document document = new Document(new iTextSharp.text.Rectangle(width,height));
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(newfile, FileMode.Create));

document.Open();
PdfContentByte cb = writer.DirectContent;
PdfContentByte under = writer.DirectContentUnder;
int i = 0;
while (i < n)
{
document.NewPage();
i++;
PdfImportedPage page1 = writer.GetImportedPage(reader, i);
under.AddTemplate(page1, 0, 0);
PdfTemplate template = under.CreateTemplate(img.Width, img.Height);
template.AddImage(img);
cb.AddTemplate(template, 0, height - img.Height); //width - img.Width - 10

}
document.Close();
}
catch (Exception de)
{
throw de;
}

 回复 引用 查看   
#209楼[楼主]
2009-03-01 20:52 | RubyPDF      
@小乞丐熊之.NET家园
说明这些PDF是被旋转过的,看下pageSize.Rotation

 回复 引用 查看   
2009-03-12 09:43 | td1[未注册用户]
你好,iTextSharp是否有透明字体,我用public Color(float red, float green, float blue, float alpha); 构造fontColor,但是并没有透明效果。我现在想把字体置透明隐藏它。谢谢。
 回复 引用   
#211楼[楼主]
2009-03-15 22:35 | RubyPDF      
没有注意过这方面的需求,能给个PDF的例子吗?


 回复 引用 查看   
2009-03-16 09:47 | td1[未注册用户]
主要是目前iTextSharp好像不支持中文加粗和斜体,所以打算用贴字图的方法解决,并在图片后隐藏字,以模拟pdf的选中、复制、粘贴文字的功能。但目前分层的话选不中图片后的文字,在同一层用图片覆盖文字的话,在foxitpdf浏览器里效果很好,但adobe浏览器里好像只要是文字,就放在图片上,这样会重叠。
所以希望能将字体置成透明,或者有在adobe里也能将文字隐藏在图片后的方法。我用的是PdfContentByte的方法。

 回复 引用   
2009-04-01 16:07 | StoneToGreece[未注册用户]
请问下大侠,itextsharp可不可以实现导入PDF文件XML表单数据的功能?有点像变相填写表单了
 回复 引用   
#214楼[楼主]
2009-04-01 16:16 | RubyPDF      
XFDF可以(XFdfReader)

其他需要你自己解析

 回复 引用 查看   
2009-04-03 09:33 | ttmax[未注册用户]
请问下大虾

我现在已有一个PDF表单 但是不知道这个表单的字段名 有没有什么办法可以得到这个表单中的字段名吗?

 回复 引用   
2009-04-03 09:36 | ttmax[未注册用户]
请问下大虾

我现在已有一个PDF表单 但是不知道这个表单的字段名 有没有什么办法可以得到这个表单中的字段名吗?

 回复 引用   
2009-04-20 17:28 | Jack Dong .NET      
LZ 或是各位

有没有知道怎么使用ITexsharp 作贝斯曲线
一直两个点的坐标,作出相应贝斯权限。

望不吝赐教。

谢谢!

 回复 引用 查看   
2009-04-23 11:24 | 执迷不悟      
谢谢,学到了。收藏了~呵呵~
 回复 引用 查看   
2009-05-07 13:28 | 阿飚
请问IDENTITY_H是什么意思
 回复 引用   
#220楼[楼主]
2009-05-07 14:39 | RubyPDF      
@阿飚
你google下吧

 回复 引用 查看   
2009-05-14 12:55 | 水中仙人掌
值为"Identity-H",类似为横向输出;按f12,看看它的定义,这是个方法问题啊。
 回复 引用   
2009-05-14 13:24 | 水中仙人掌
不知大家对行首出现中文标点符号这种不符合行文规范的问题如何解决的,我现在就有这个问题,非常头疼。如果有解决方案的希望不吝赐教,谢谢了!
 回复 引用   
2009-05-20 00:26 | 许培
你好,我现在正在做一个项目,具体任务是:
对于一个给定的中文PDF(含有表格),编写翻译程序将其内容翻译为英文再写入到一个新的PDF中。
我的处理思路是:对于给定的中文PDF,对其内容进行检索,边检索边进行翻译,再对其修改,最后保存为一个新的PDF。
但存在一些技术难题:
1:怎么对PDF的内容进行检索
2:怎么对PDF的内容进行修改
3:程序如何识别PDF中的表格(如果1和2解决了,该技术就不需要了)
我在网上查看的关于处理PDF的技术,如iText,PDFBox,都是写入或读取PDF,或进行简单的处理,没有一篇关于检索和修改的(或许我还没发现)。


急待解决,谢谢!

我的邮箱:xupeixupei@yahoo.cn
我的QQ:413160258


 回复 引用   
#224楼[楼主]
2009-05-20 10:57 | RubyPDF      
@许培
对于你的需求我无能为力
以我的能力,这是不可能的任务。

 回复 引用 查看   
2009-05-20 11:04 | Jack Dong .NET      
PDF的存在是为了阅读和传输的,你是不能像word或是txt那样读取其文件内容的,一些基于PDF做开发的软件公司产品可以解析PDF,往往是基于该公司另一个或是同一产品 自定义的PDF。所以你这个想法 对所有的PDF 是不可能的。



 回复 引用 查看   
2009-06-05 09:35 | yau[未注册用户]
你好,我用iTextSharp這元件可以轉成pdf和rtf
但我想轉成word檔,是rtf格式的
但是字型想改成標楷體,PDF是成功的,但rtf檔卻沒辦法
請問有什麼方法可以設嗎,謝謝了

Imports System
Imports System.Web
Imports System.IO
Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports System.Web.SessionState
Imports System.Data.SqlClient
Imports RtfWriter = iTextSharp.text.rtf.RtfWriter
Imports RtfHeaderFooters = iTextSharp.text.rtf.RtfHeaderFooters


Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load


Dim doc As Document = New Document
Dim writer As RtfWriter = RtfWriter.GetInstance(doc, New FileStream(Context.Server.MapPath("~/aa.doc"), FileMode.Create))

Dim fontPath As String = Environment.GetFolderPath(Environment.SpecialFolder.System) & "\..\Fonts\kaiu.ttf"
FontFactory.Register(fontPath)



Dim footerfontChinese As iTextSharp.text.Font = FontFactory.GetFont("標楷體", BaseFont.IDENTITY_H, 8.0F)

Dim header As HeaderFooter = New HeaderFooter(New Phrase("中文測試:", footerfontChinese), False)
header.Border = iTextSharp.text.Rectangle.NO_BORDER
doc.Header = header


Dim footer As HeaderFooter = New HeaderFooter(New Phrase("page: ", footerfontChinese), True)
footer.Border = iTextSharp.text.Rectangle.NO_BORDER
doc.Footer = footer

doc.Open()

Dim fontChinese As iTextSharp.text.Font = FontFactory.GetFont("標楷體", BaseFont.IDENTITY_H, 14.0F)
Dim TitlefontChinese As iTextSharp.text.Font = FontFactory.GetFont("標楷體", BaseFont.IDENTITY_H, 16.0F)

Dim EventName As Paragraph = New Paragraph(fontPath, fontChinese)
EventName.SetAlignment("Center")
doc.Add(EventName)


Dim title As Paragraph = New Paragraph("中文測試", FontFactory.GetFont("標楷體", BaseFont.IDENTITY_H, 16.0F, Font.BOLD))
title.SetAlignment("Center")
doc.Add(title)


Dim title2 As Paragraph = New Paragraph("中文測試", FontFactory.GetFont("標楷體", BaseFont.IDENTITY_H, 16.0F, Font.BOLD))
title2.SetAlignment("Center")
doc.Add(title2)


doc.Close()


Dim fileinfo As New System.IO.FileInfo(Context.Server.MapPath("~/aa.doc"))
Dim FileName As String = "aa.doc"
If fileinfo.Exists = True Then
Context.Response.AddHeader("Accept-Language", "zh-tw")
Context.Response.AddHeader("Content-Disposition", "attachment; filename=" & HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8))
Context.Response.AddHeader("Content-Length", fileinfo.Length.ToString())
Context.Response.ContentType = "application/octet-stream"
Context.Response.WriteFile(fileinfo.FullName)
Context.Response.Flush()
Else
Context.Response.Write("[" & FileName & "]檔案不存在")
End If
End Sub



 回复 引用   
#227楼[楼主]
2009-06-05 09:39 | RubyPDF      
@yau
请确认FontFactory里有你想使用的字体名称。

 回复 引用 查看   
2009-06-05 11:22 | Louis_h[未注册用户]
楼主,你好,很感谢你的教程,我现在做的PDF相关东西从这里学到了很多.
现在有个小的问题想问一下,
我想在特定的位置写表格,
比如在一些文本后面加表格,直接用Table类,然后用document.add(table);
的话,表格总是出现在页面的最上方,没有办法控制位置,
我目前的文本位置控制是把文本放在columnText里边实现的,我想把Table也放进去,好像不行.....
这个是怎么实现的,可以说一下吗?
我的邮箱,warriorhelu@yahoo.com.cn
谢谢

 回复 引用   
2009-06-05 13:46 | yau[未注册用户]
@RubyPDF
在FontFactory是確認有的
轉成pdf可以轉成這個字型
但轉成rdf就沒辦法了,是否只限用在pdf上呢?

 回复 引用   
2009-06-05 13:47 | yau[未注册用户]
@yau
說錯了,是轉成rtf沒辦法轉這個字型

 回复 引用   
2009-07-17 16:13 | gfdsgdf[未注册用户]
请问大侠,我现在想生成一个目录,可是标题有长有短,请问 标题和后面页码之间的点线(......)的长度怎么控制
2.还有就是在特定的位置showTextAlign(。。 ),如果字符放的长度过长,怎么办?它好像不会自动换行啊
谢谢
谢谢 您的指导!

 回复 引用   
2009-07-17 16:15 | wangdawei[未注册用户]
请问大侠,我现在想生成一个目录,可是标题有长有短,请问 标题和后面页码之间的点线(......)的长度怎么控制
2.还有就是在特定的位置showTextAlign(。。 ),如果字符放的长度过长,怎么办?它好像不会自动换行啊
谢谢
谢谢

 回复 引用   
2009-09-04 08:45 | hzgzh      
请问 ITEXT是否支持PDF中的图画工具中的文本框工具,我经常要在PDF上增加文本框,希望能通过编程的方式来自动完成,如把搜索到的英文文本上覆盖一个文本框,请问能通过ITEXT实现吗?
 回复 引用 查看   
2009-09-23 17:07 | humi[未注册用户]
大侠 问2个问题
document.add( new Paragraph( new Chunk("back page",
FontFactory.getFont( FontFactory.HELVETICA, 16, Font.BOLD, new Color( 0, 0, 0))).setAnchor("http://www.google.com");

为何那个“back page”处只能用英文 不能用中文 用中文就无法显示(pdf其他地方能显示中文 也做了中文处理)

第二个问题
我如何在指定位置写一个超链接呢。只是能在指定位置写一个普通文本
PdfContentByte cb = writer.getDirectContent();
BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
cb.beginText();
cb.setFontAndSize(bf, 12);
cb.setTextMatrix(100, 400);
cb.showText("Text at position 100,400.");
cb.showText(new Paragraph(
new Chunk("aaa", FontFactory.getFont(
FontFactory.HELVETICA, 16, Font.BOLD, new Color(
0, 0, 0))).setAnchor("MeaItemPayPdf.do?bid="+bid+"&page="+(Integer.parseInt(page)-1))).toString());
cb.endText();

敬请指教 谢谢

 回复 引用   
2009-11-01 11:04 | lucinkapes[未注册用户]
Hello, Can I ask what I must do if I want write to PDF char "č" (http://www.fileformat.info/info/unicode/char/010d/index.htm) Other our czech chars are ok! (for example "ř","š", etc work good). If I write "č" I see whitespace only. Thank you for your advice.
Lucinkapes
Czech Republic

 回复 引用   
2009-11-03 07:46 | lucinkapes[未注册用户]
Really you not know? please.
 回复 引用   
#237楼[楼主]
2009-11-03 14:12 | RubyPDF      
引用lucinkapes:Really you not know? please.


Sorry for the delay, I am some busy recently, and the code you want,
Document doc = new Document();

PdfWriter.GetInstance(doc, File.Create(@"c:\a.pdf"));
doc.Open();
BaseFont bf = BaseFont.CreateFont(@"c:\windows\fonts\Arial.ttf", BaseFont.CP1250, BaseFont.EMBEDDED);
Font font = new Font(bf, 10);

doc.Add(new Paragraph("č", font));
doc.Close();

P.S. not all fonts support this character, please check the webpage you give me, and find which font supports it.

 回复 引用 查看   
2009-11-19 11:13 | minimo[未注册用户]
我想知道有什么办法将aspx或html页面转换成pdf?

谢谢

 回复 引用   
#239楼[楼主]
2009-11-19 16:01 | RubyPDF      
引用minimo:
我想知道有什么办法将aspx或html页面转换成pdf?

谢谢

没有太好的办法
需要格式化为xhtml,但iTextSharp现有的类对html的tag支持有限,自己要做更多努力

 回复 引用 查看   
2009-11-23 17:51 | 夜猫子罗      
请问一下楼主用的是哪个版本的itextsharp?是4.16版本吗?请问楼主有英文的itextsharp api吗?官方的那种
 回复 引用 查看   
2009-12-02 23:58 | ansenyu[未注册用户]
楼主,你好!我现在遇到一个问题,在PDF中加入由CAD输出的WMF文件时,WMF文件中的汉字有的会出现乱码,不知道有什么办法可以解决?
期盼佳音!谢谢!

 回复 引用   
#242楼[楼主]
2009-12-08 12:06 | RubyPDF      
引用ansenyu:
楼主,你好!我现在遇到一个问题,在PDF中加入由CAD输出的WMF文件时,WMF文件中的汉字有的会出现乱码,不知道有什么办法可以解决?
期盼佳音!谢谢!

麻烦你给我一份wmf,我看看

 回复 引用 查看   
2011-10-26 10:50 | panxiong      
大侠 问1个问题
document.add( new Paragraph( new Chunk("back page",
FontFactory.getFont( FontFactory.HELVETICA, 16, Font.BOLD, new Color( 0, 0, 0))).setAnchor("http://www.google.com");

为何那个“back page”处只能用英文 不能用中文 用中文就无法显示(pdf其他地方能显示中文 也做了中文处理)

 回复 引用 查看   
#244楼[楼主]
2011-10-26 16:40 | RubyPDF      
引用panxiong:
大侠 问1个问题
document.add( new Paragraph( new Chunk("back page",
FontFactory.getFont( FontFactory.HELVETICA, 16, Font.BOLD, new Color( 0, 0, 0))).setAnchor("http://www.google.com");

为何那个“back page”处只能用英文 不能用中文 用中文就无法显示(pdf其他地方能显示中文 也做了中文处理)



你这是java的代码
使用中文,你得用中文的字体
如果用中文字体仍然有问题,你把代码贴出来,我看看

 回复 引用 查看   
2011-11-09 12:58 | mmmmmmm      
楼主,我怎么用都不能显示中文怎么回事?只有chapter和section的title中才会有中文显示。
 回复 引用 查看   
2011-12-05 14:21 | CSharpProber      
您好,我是刚研究itextsharp这个控件的,使用过程中出现了一些问题,望不吝赐教:
问题描述:把一批尺寸大小不一的图片批量添加到一个PDF中时,生成的PDF尺寸大小与原图片不一致,我使用了SetPageSize这个方法,生成后大部分是一致的,只有在遇到这种情况时出会现偏差,如:
第1张图片大小为1652*2338.
第2张图片大小为2338*1652.
第3张图片大小为5338*4296.
第4张图片大小为1652*2338.
第5张图片大小为5338*4296.
第6张图片大小为1652*2338.
第7张图片大小为1652*2338.
批量添加到一个PDF中时,按原始尺寸缩放设置后第4张和第6张的图片大小是第3张和第5张的大小,不是设置的大小

 回复 引用 查看   
#247楼[楼主]
2011-12-06 01:14 | RubyPDF      
@CSharpProber
方便把代码放上来看看,这种情况,恐怕还是你没有正确设置Pdf page的尺寸。

 回复 引用 查看   
#248楼[楼主]
2011-12-06 01:15 | RubyPDF      
@mmmmmmm
最后附上你的代码,否则我也没有办法回答你

 回复 引用 查看   
2011-12-06 10:28 | CSharpProber      
string strImagePath = "E:\\Workspace\\图片\\00000039-1";
if (Directory.Exists(strImagePath))
{
string[] imageFiles = Directory.GetFiles(strImagePath);

Document docAll = null;
PdfWriter pwAll = null;
for (int i = 0; i < imageFiles.Length; i++)
{
string imgFile = imageFiles[i];
string[] imgName = imgFile.Substring(imgFile.LastIndexOf("\\") + 1).Split('.');

if (imgName[1].ToLower() == "jpg" || imgName[1].ToLower() == "tif" || imgName[1].ToLower() == "gif")
{
Image img = Image.GetInstance(imgFile);
float percent = 72f / img.DpiX;
img.ScalePercent(percent * 100);

string savePath = "E:\\Export\\PDF\\单层\\";
if (!Directory.Exists(savePath))
{
Directory.CreateDirectory(savePath);
}

string pdfName = "00000039.pdf";

if (i == 0)
{
docAll = new Document(new Rectangle(img.Width * percent, img.Height * percent), 0, 0, 0, 0);

if (File.Exists(savePath + pdfName))
{
File.Delete(savePath + pdfName);
}
pwAll = PdfWriter.GetInstance(docAll, new FileStream(savePath + pdfName, FileMode.Create));
pwAll.PdfVersion = PdfWriter.VERSION_1_6;
docAll.Open();
}

docAll.Add(img);

if (i != imageFiles.Length - 1)
{
string[] tempImgName = imageFiles[i + 1].Substring(imageFiles[i + 1].LastIndexOf("\\") + 1).Split('.');
if (tempImgName[1].ToLower() == "jpg" || tempImgName[1].ToLower() == "tif" || tempImgName[1].ToLower() == "gif")
{
Image nextImage = Image.GetInstance(imageFiles[i + 1]);
float width = nextImage.Width * percent;
float height = nextImage.Height * percent; docAll.SetPageSize(new Rectangle(width, height));
docAll.NewPage();
}
}
}
}

if (docAll.IsOpen())
{
docAll.Close();
}
}
这是我测试的代码,请指正....

 回复 引用 查看   
评论共3页: 上一页 1 2 3