2016年8月30日 星期二

統一發票列印小程式


因為公司會在一堆系統上都有可能要印發票(真不懂要怎麼搞?)

希望可以有個小工具可以列印電子發票,

原本發票列印程式要使用條碼機專用語言(ZPL、EPL),但容易被某種機型綁定。

當然可以考慮使用ESC/POS指令的方式,但也是要印表機支援這種指令列印模式(當然多數表機都有支援),不過要列印QR碼,就有點不是那麼容易了,除了要自己編碼外還要注意中文問題。

後來我想改用Windows Printer Driver來列印,雖然不如指令式快速,但可以方便各類型程式應用,因此考慮了以下的條件:

使用C#開發、.Net 2.0平台、Console呼叫

本來想用RDLC來做,但是很不幸的,失敗了,原因就在於條碼,
國稅局訂定的Code39條碼內要放入21個字元(19+2)長度,
如果使用RDLC的話,解析度只有100DPI,密度不夠,條碼線條沾黏嚴重。

一般的條碼機至少都有200DPI得等級,這RDLC也太彆腳了吧,
網路上找盡RDLC條整解析度的方式都沒有比較好的效果。

因此,改用直接C#繪製的方式來做,
當然中間為了條碼圖像清晰度的問題花了不少心力解決。

下載點:PrintInvoice



使用方式:
1、先設定好列印發票的印表機驅動程式內的紙張,或是裁切指令等。
2、產生資料檔 Data.xml (可以參考程式裡面的Data.xml內容)
3、用程式呼叫小程式,並賦予參數
   參數 :
              -i 指定資料來源檔案 (XML檔)
              -p 指定送出的印表機

版面配置:

每一個紅框都對映著XML裡面每個欄位的資料(自行參考XML裡面的註解)

其他事項:
invclogo.bmp 可以修改、更換,建議為純黑白色的BMP檔。
中間Code39條碼可能會隨印表機的解析度略有寬度上的變化。
Data.xml 是BIG5編碼資料。
每個QR碼內容最多120BYTE長度,QR碼編碼為UTF-8、容錯度:L。

已經測試過雷射印表機、條碼機、PDF印表機,目前都沒問題

其他電子發票資訊請參考-財政部電子發票整合服務平台



80 個回應:

匿名 提到...

你好,請問這個發票程式是你寫的嗎?好厲害,我有相關問題想要請教你不知道方不方便,麻煩可以給我你的mail嗎?我的mail是ulo0601@gmail.com,期待你的來信,謝謝

匿名 提到...

你好,請問這個發票程式是你寫的嗎?好厲害,我有相關問題想要請教你不知道方不方便,麻煩可以給我你的mail嗎?我的mail是ulo0601@gmail.com,期待你的來信,謝謝

鄭有為 提到...

您好,方便參考您的CODE嗎?我自己也是用「預設印表機」的方式處理,可是印出來都很怪;希望可以參考您是如果開發的,感恩,希望沒有打擾到您^^

may_day_software@hotmail.com

翁大砲 提到...
作者已經移除這則留言。
翁大砲 提到...
作者已經移除這則留言。
宗雄陳 提到...

Hi, 電波兄

小弟我公司也正在進行turnkey的開發,目前卡在列印證明聯上,不知 電波兄 是否可以分享你的部分code供小弟學習.

WILDOX 提到...

Re: 宗雄陳 <5562221134482932967>
您好,抱歉工作忙碌今日才回,若您需要原始碼,請給我可以寄送的電郵信箱,我會寄發給您的
目前原始碼只給私訊喔,謝謝

huang jen wang 提到...

hi 電波哥

也方便跟您要下code嗎?感謝.

Unknown 提到...

Hi, 您好, 方便跟您要個code嗎? 或是網路上是否有相關.net 電子發票 code範例可參考, 找了一陣子, 都看不到可踏出第一步的資料, 感溫!!

匿名 提到...

您好,方便參考您的原始碼嗎?作為我參考撰寫的方向,我的EMAIL是prj0589@holdav.ddns.net,再次感恩。

WILDOX 提到...

Re: 匿名 <5276640549239078381>
您好:我已經回信給您囉

WILDOX 提到...

Re: huang jen wang <2669284891016057027>
您好,很抱歉,可以給個信箱嗎?因為目前不公開,但我可以email給您

WILDOX 提到...

Re: Unknown <6444599758475234201>
您好,很抱歉,可以給個信箱嗎?因為目前不公開,但我可以email給您

huang jen wang 提到...

您好!我的email是 :
lasdin@gmail.com.在此先謝謝您了

WILDOX 提到...

Re: huang jen wang <925088204537523345>
您好,已經回您了喔

Simon Hou 提到...

不好意思, 不會使用Blogger, 我的mail是: simon@xinlanlc.com.tw, 感謝!

WILDOX 提到...

Re: Simon Hou <1366410652103888819>
沒關係,已經回給您囉

匿名 提到...

Hi,電波大大
可否分享您的 Code給我參考學習嗎?謝謝!!
E-mail: hsiu_tseng@tw.uneec.com

Roger 提到...

您好 可否分享您得程式碼嗎?
感謝您
tzerulin@gmail.com

lavery 提到...

你好, 可以分享您的程式碼給我嗎?
mail:laverylin@gmail.com
感謝.

po hung chou 提到...

你好 想和你要一下原始碼,或直接與您請教
目前都己做好輸出了,但logo印出位置都無法像您圖所示上方無空白,大約還有一公分空間,期待您的來信pohungchou@gmail.com

moo 提到...

您好 我對這類的程式非常感興趣 也方便給我一份code嗎?
非常感謝您

moo.and.music@gmail.com

洪裕彬 提到...

您好 我對這類的程式非常感興趣 也方便給我一份code嗎?
非常感謝您
pklaz0078@gmail.com

Bruce 提到...

您好 對於這發票列印程式非常感興趣 還請MAIL
感謝您的分享 !!
workfh@gmail.com

黃谷豐 提到...

您好,很感謝您可以分享您的程式,麻煩亦請寄一份給我參考!
Email:kfhuang7233@gmail.com

匿名 提到...

你好~
這個發票很程式很有幫助~我也遇到發票列印的問題~
可以提供原始碼嗎~
非常感謝~
我的email: andyxiechen@gmail.com

WILDOX 提到...

-------------------
^^^^^^^^^^^^^^^^^^^
此線以上已回信.....

Simon Hou 提到...

Hi, 經由板主無私的分享原始程式後, 終於稍能瞭解電子發票原理。 如各位Programer有興趣經由esc/pos command 直送com port印出的也可參考以下我google到的另一份C#原始碼, 內有"電子發票_EscPos_SDK.rar" C#原碼連結網址:

http://dearsherlock.github.io/star%20printer/starsdk-to-generate-qrcode



WILDOX 提到...

Re: Simon Hou <8418630204174944843>
感謝 Simon Hou 的分享,大家可以互相學習一下關於ESC/POS 控制方式~~

WILDOX 提到...

Re: Simon Hou <8418630204174944843>
文章裡面有很重要的一點,就是關於39碼的比例,依照一般的設定2:4確實會無法將條碼完整印出,如用條碼字型由於比例關係也容易導致縮放後比例變型,而不容易被讀出。利用機器本身指令碼可以控制39碼的粗細比,達到將19個字元的39碼列印進去的目標,GJ!

匿名 提到...

你好,
我目前也在開發電子發票
可以參考你的原始碼嗎~
我的email: zonhon@gmail.com
謝謝...

匿名 提到...

您好
我也想開發這類的程式,對於您開發的程式很感到興趣。方便給我一份您的code 參考嗎?
感謝您
email: s7630978@yahoo.com.tw

Wang D.J. 提到...

請問可以連續印多張發票嗎?還是一個XML只能印一張?

匿名 提到...

你好:
目前也在開發電子發票,也想參考一下,
方便也給我一份Code參考嗎?
謝謝
email:ayay8221@gmail.com

Unknown 提到...

您好
您的列印程式真的很好用
方便跟您要原始碼嗎?
如果可以請您寄到
tommy@fiat.club.tw
感謝您了

gsc0210 提到...

您好
不知道是否可以取得您的原始碼,那對後進我在學習C#語言上是一大幫助,真的很感謝。
我的EMAIL: gsc0210@ms9.hinet.net

shen 提到...

您好,感謝您大方分享您的程式,可否麻煩寄一份給我,謝謝!
Email:shen.cpa@msa.hinet.net

WILDOX 提到...

Re: Wang D.J. <542587048530393705>
Hi Wang D.J. : 這個XML一次只能一張喔..

kunghan lin 提到...

電波兄 您好:
目前也遇到電子發票列印的問題,由於沒這方面的Know How,所以不知是否能請您分享Source Code可以研究學習,感恩。
小弟eMail:kunghan0428@gmail.com

huang jen wang 提到...

電波兄,先謝謝你上次分享程式.我這邊遇到一個小問題,就是透過小程式列印的發票會抓取當天日期,若要列印之前日期的發票是否有辦法?ex20170926列印20170812開立的發票

匿名 提到...

你好,最近也在開發電子發票列印的程式,想跟你要可分享的原始碼,謝謝
我的Mail: rogerleekee@gmail.com

WILDOX 提到...

Re: huang jen wang <3485647643103429601>
Hi
在 Data.xml 裡面標籤 <col name = "printtime">2016-08-23 22:39:46</col> 可以拿來用

然後修改程式 262 行 e.Graphics.DrawString(now.ToString("yyyy-MM-dd HH:mm:ss"), mFont, Brushes.Black,
改成 e.Graphics.DrawString(row["printtime"].ToString(), mFont, Brushes.Black,

就變成自己給列印時間了,
原本我有定義,但因為考慮到LOCAL機器列印時間比較符合所以在程式裡面改成now的方式
如果需要自己定義列印時間,那就把它恢復吧

huang jen wang 提到...

萬分感謝

呂美蘭 提到...

希望也能取得源碼,研究探討一番

WILDOX 提到...

Re: 呂美蘭 <5443695574500423684>
Hi 請問有郵件嗎?我可以寄檔案給你

呂美蘭 提到...

先謝謝電波,我的郵箱為p84586@msn.com
再次感謝你。

匿名 提到...

你好:
不好意思,
希望可以給我一份Code參考
謝謝
email:ayay8221@gmail.com

ken kao 提到...

您好!
方便跟你要一份code來參考嗎?
感激不盡!
kwk321@gmail.com

匿名 提到...

電波大大,

懇請您提供給我source code, 感恩!
email: wenchan.huang@gmail.com

Rj Lwo 提到...

您好

可以跟您要一份原始碼參考嗎?
我的email: rabbit.lwo@gmail.com
麻煩您
謝謝

匿名 提到...

您好:
因為我們公司希望自建TURNKEY,在列印證明聯的QRCODE是要用圖檔列印
但無法達到左右兩邊的QRCODE尺寸大小一致,可否請您分享一下您的程式讓我參考學習.
謝謝
e-mail: amy1108.yang@msa.hinet.net

WILDOX 提到...

Re: 匿名 <9165127048254945784>
QR code 本身會受到內容影響大小的,所以建議您把每個QRcode內容定在128byte
這樣會讓它的大小固定,內容不足的部分就以空白替代是可以的。

BingDa Tasi 提到...

您好

可以跟您要一份原始碼參考嗎?
我的email: bingda0325@gmail.com
麻煩您了.謝謝!!

ypiao 提到...

你好!也可以分享一下源碼給我嗎?
謝謝!感恩:ypang68@gmail.com

吳肇祐 提到...

您好,我也正在開發電子發票,現在也走到列印報表的部分了
可以跟您要一份原始碼學習嗎?

謝謝再謝謝
我的mail是frankiewu61@gmail.com

匿名 提到...

Hi, 電波兄

方便跟您要一下code參考學習嗎?我的EMAIL是 chenph@etc.org.tw,感恩您。

匿名 提到...

您好,最近公司也在上B2C電子發票,被QRCODE困擾很久,方便跟您要一下code參考嗎?我的EMAIL是 michelle_chen@sentien.com.tw,謝謝您。

Zac Chung 提到...

您好,我最近也在研究電子發票,可否分享您的CODE給我參考?謝謝!!
我的EMAIL:f20020108@gmail.com

Sky 提到...

您好, 我最近也在研究有關發票的寫法, 方便參考您的code學習嗎? 謝謝!
Mail: wiwi.sky0415@gmail.com

匿名 提到...

你好:
目前也在開發電子發票,目前在QRcode那邊煩惱很久,
方便也給我一份Code參考嗎?
謝謝
email:open15987@gmail.com

George 提到...

你好:
目前也在開發電子發票,也想參考一下,
目前問題也是出在條碼的清晰度問題~
方便也給我一份Code參考嗎?
謝謝
email:fgtyu2001@gmail.com

Mayo Lin 提到...

您好
可以跟您要一份原始碼參考嗎?
我的email: hsen7@hotmail.com
麻煩您
謝謝

劉明睿 提到...

你好,我也可以要一份原始檔嗎

Email:rayrevolutionliu@gmail.com

感謝您

謝謝

KA.Kevin 提到...

您好!

懇請惠賜 您的 source code 供參考!
我的email: ka.kevinliu@gmail.com
謝謝您!

木頭人 提到...

您好,
最近對這方面的程式有興趣,是否還能提供source code參考呢?
email: combivir.yu@gmail.com
感謝

Wenchung Chang 提到...

您好!
懇請惠賜 您的 source code 供參考!
我的email是 :
wcchang.hh@gmail.com
在此先謝謝您了

黃銘毅 提到...

Hi, 您好!

可否提供您的Source Code作參考.
我的EMAIL: learn66@pchome.com.tw

Thanks.

WILDOX 提到...

Re: 黃銘毅 <3069496163262425774>
您好,您的信箱無法寄送,出現『未知的收件人』喔

遠端伺服器的回應如下:
550 5.1.1 : Recipient address rejected: User unknown in relay recipient table

Josh 提到...

您好,最近工作上也在研究電子發票列印的程式,若是方便的話也請寄給我原始碼做參考 萬分感謝。
email: distract777@gmail.com

匿名 提到...

您好,最近工作上碰到一些發票的問題,不知道可否提供您的原始碼作為參考呢~? 謝謝。
email:zxcvb1229@gmail.com

0523 felix 提到...

你好,最近在研究發票是如何產生,想和您拿一份原始碼做參考
我的e-mail是felix0523tw@gmail.com
麻煩您了
謝謝

黃銘毅 提到...

Hi, 您好!

不好意思,改用myh0511.tw@gmail.com,
請再提供您的Source Code作參考.
感謝.

蔡世珉 提到...

您好,非常感謝您提供您的程式
小弟目前在開發Web POS系統(PHP),需連結發票機印出電子發票
正苦惱多時,剛好看到您的文章,讓我看到一道曙光
C#不是很熟,不知道能否跟您討要Sorce Code研究
另外不知道您知不知道怎麼用php結帳時傳值然後呼叫小程式列印?
我的信箱: a0935756869@gmail.com
非常感謝您!

Simon Hou 提到...

To 蔡世珉:
PHP網路上有整套的列印模組原始碼程式可以參考。
https://github.com/mike42/escpos-php

WILDOX 提到...

Re: Simon Hou <5880924893902936515>
Hi 感謝Simon Hou提供範例給大家交流。

WILDOX 提到...

Re: 蔡世珉 <9205781394453787246>

HI 我已經寄給你囉

您可以參考 Simon Hou大 給的範利看看是否符合需求,這是一種直接由PHP控制列印方式,
前提是你的環境下可以由伺服器端控制到那部印表裝置。

但如果你的伺服器端無法控制到那部印表裝置就得使用其他方法做。

一般來說WEB系統要列印的方法,如果不使用瀏覽器本身的列印方式,其實就是想辦法讓瀏覽器呼叫本地端程式,
其實這是有風險的,因為就是怕病毒植入本機,所以瀏覽器才會禁止這種呼叫本地程式的行為。

早期微軟為了可以做到這點所以出現了ActiveX這種程式可以註冊到 IE 執行,但是缺點是只有 IE only
遇到windows升級問題也會造成ActiveX問題多多,當然各家瀏覽器都有插件可以做,但是每種瀏覽器的插件開發方式都大不相同,因此腦燒工程師,也造成維護成本太高,漸漸大家都不願意做插件。

但是底下有幾種方式可以參考:

第一種利用瀏覽器核心套件開發專用瀏覽器,像是以前對岸有很多自製瀏覽器可以控制本機電腦的程式,以利政府監控人民等,這種自製瀏覽器可以攔劫特定的HTML TAG或是http header命令去執行特定的本機工作。如果公司還極度封閉的有可能使用這種方式:不讓使用者接觸一般的瀏覽器,只能使用公司自己開發的聯覽器之類...

第二種比較流行就是透過第三方『偽協定』程式(也可以自己寫程式,只要能接受URL呼叫即可)註冊到電腦,讓它成為通訊協定的方式,WEB利用呼叫一個假定的協定讓這個程式可以運作,不管是傳送資料或是執行程式都可以,你可以參考底下的程式(懶得寫可以用它開發的,但原理是類似)
http://blog.pulipuli.info/2017/03/windowssystem-protocol-open-windows.html

像是最著名的就是 ed2k:// (電驢/VERYCD) thunder:// (迅雷) qqdl:// (訊騰下載) 這種程式使用的方式

本人沒有開發過這種方式,但有稍為研究過,因為其實這種方式早在微軟推出MSN時就開始使用,而且微軟也沒有公開,好像是被Hacker發現公開的。

現在我有在玩MIT學生開發的安卓開發工具 http://ai2.appinventor.mit.edu
這個網站也是要裝一個aistart程式可以接受web的原始碼到本地電腦,並且編譯程式,並發佈到手機上,使用的也是這種原理。

※還是要提醒您,第二種方式現在常見於各大免費空間網站,要求你下載一個程式(有時候會偽裝檔名成為你要下載的檔案)然後才能繼續下載你要的檔案,這個是很可怕的漏洞,因為有的會去綁架首頁、安裝廣告軟體、或是開通本機偽協定讓各大駭客網站可以以自由進出你的電腦等...

蔡世珉 提到...

非常感謝Simon Hou和WILDOX提供的方式
兩種方式我都會研究試試看
有遇到其他問題在向你們請教

Simon Hou 提到...

To 蔡世珉、版主:
看到蔡Sir寫開發Web POS系統(PHP), 應該是指user端的pos機用的, 想到有公司開發出使用php.exe執行背景服務Listen 到如http://localhost:***(不用在本機安裝網站及php), 然後使用上面那個提到的php printer原始碼來達到本機列印到Thermal printer(com port, driver, usb, api等等連接模式) , 不熟php, 只是最近研究發票機時有看過。

猴子 提到...
作者已經移除這則留言。
侯昱宏 提到...

您好 我是中原大學資工系的學生
因為專題跟電子發票有關
現在也卡在列印發票證明聯的部分
能否跟您要個Source Code作參考嗎?
信箱:s10427221@cycu.edu.tw
感謝您