台灣最大程式設計社群網站
線上人數
1259
 
會員總數:246039
討論主題:189629
歡迎您免費加入會員
討論區列表 >> ASP.NET >> iTextSharp PDF 中文效能
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
iTextSharp PDF 中文效能
價值 : 100 QP  點閱數:2364 回應數:8
樓主

烏龜
門外漢
0 5
282 21
發送站內信

各位大大好

小弟想請問iTextSharp PDF 中文效能的問題
下方程式"SetFieldProperty"是將該欄位支援中文
一但加了此語法,效能大大的下降
請問小弟該如何寫,才能改善效能問題呢?

目前效能慢的主要是以下兩點
1. 26行的PdfReader reader = new PdfReader(Server.MapPath("~/TemplateForms/08_RegistrationFormTemplate_Collective.pdf"));
2. 43行的form.SetFieldProperty(entry.Key, "textfont", bfChinese, null);//此語法會導致每一次PDF變慢約7

小弟有發現到在同一個form底下使用多少次SetFieldProperty效能不會差太多(約7秒)
但如果每次都新建(26行那行指令)
就會導致每次都浪費7秒
有無辦法可以將範本檔案都先存到暫存臨時MemoryStream
之後將變數填入後再累加到將要輸出的MemoryStream


搜尋相關Tags的文章: [ iTextSharp ] , [ PDF ] , [ 中文 ] , [ 效能 ] , [ .Net ] , [ Aspx ] ,
本篇文章發表於2013-12-07 10:43
1樓
回應

香帥
檢舉此回應
因您的08_RegistrationFormTemplate_Collective.pdf沒讓人下載,無法實際測您的pdf檔
隨便用一個24頁的pdf就很久跑不出來,到超過記億體當掉,因此跟您的樣板有絕對關係
至於中文設定幾忽不影響,
我用我的server模擬您的300頁中文資料,程式碼如下:

測試網址在我的server
http://ap.a168a.com/itextsharp
您會得到pdfexample.pdf下載檔案,當您打開它時,翻到第300頁
您會看到如下圖

才384毫秒,相當快,中文設定幾忽都沒有影響
本篇文章回覆於2013-12-08 02:21
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

香帥
檢舉此回應
我用您的檔案試了很久之後,很不好意思,目前還是沒辦法改善那個指令,但還是要先跟您回應:
itextsharp好不容易被樓主發現它的死角
form.SetFieldProperty(entry.Key, "textfont", bfChinese, null);//此語法會導致每一次PDF變慢約7秒
確實會很慢,慢到不行,雖然您的迴圈可再縮減一圈,還是因為那個指令慢到不行,到不是樣本檔的因素,建議可先改用我一樓方法去達到相同目地.

本篇文章回覆於2013-12-16 20:05
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

烏龜
檢舉此回應
香帥大大 您好

感謝您大力協助小弟測試此問題
由於範本檔是交由其他非程式相關人員製作
所以要他們寫Code太為難他們了(因為檔案樣式會常常更改)
小弟看看有無其他元件或方式可以解決此問題

感謝
本篇文章回覆於2013-12-17 10:23
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

香帥
檢舉此回應
不過,別洩氣
因為我原只就您的迴圈及指令去測,還有在看JsonConvert會不會影響
只不過先跟您說一下,您那指令確實是iTextSharp的死角
我會再抽空去研究iTextSharp原始相關資料,相信不久會找到更好答案,再來將解答貼到這.
本篇文章回覆於2013-12-17 14:35
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
最有價值解答

香帥
檢舉此回應
這兩天研究,終於被我突破了,用以下程式碼會將原來需費時超過30分,變成8秒多就可完成了,我將那指令備註//用這個非常快百倍
程式碼如下
還有我將您的迴圈也減肥一下
整個程式碼如下:

本篇文章回覆於2013-12-18 22:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

烏龜
檢舉此回應
香帥大大 您好

抱歉小弟這幾天出差
只到現在才有時間看
那行指令真的效率差好多!!
QP將奉上

另想請問香帥大大是如何發現這個方式~~
來偷學一下思考流程XD

非常感謝
本篇文章回覆於2013-12-26 10:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

香帥
檢舉此回應
或許是您的福氣,這題花了我太多時間,通常寫得太複雜,我只是會稍微提點一下,因您同一個題目,再到不同的地方發問一遍,看很久都沒人回覆您,我再投入研究,因您的json還要去下載相關的來安裝,原先還誤以為是json的緣故,想就以我自己做無json的for迴圈給您參考,
建議您以後將無關的先排除,會更容易得到解答
我有進去看他的原始碼,將AcroFields類別跟font有關的方法找出來試看看就可發現AddSubstitutionFont這個方法



本篇文章回覆於2013-12-26 22:48
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
作者回應

烏龜
檢舉此回應
香帥大大 您好

感謝您百忙抽空解題
因google都是使用"SetFieldProperty"的方式
雖然知道要找其他方式來撰寫
卻不得其門
小弟又學到一個方式可以處理問題的方式XD

關於問問題的方式小弟往後會改進
不過JSON真的很好用


非常感謝
本篇文章回覆於2013-12-27 09:38
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.