統一發票列印小程式

1、請注意本版留言過多,您的留言可能不在這一頁,請到以下留言樓層看看再回應喔~ 
2、如果您有填寫表單,卻沒有收到我的郵件,有可能您填寫的電子郵件有錯誤,麻煩您查看一下留言是否有我給您的信息喔。因為我沒辦法直接連繫到您。
1 ~200 則,請按這裡 
200+ 以上請按這裡


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

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

原本發票列印程式要使用條碼機專用語言(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印表機,目前都沒問題

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


先說明一下,考慮有網友反映希望把電子郵件清除的要求,為避免留言過多導致維護困難,所以如果有須要原始碼的網友,請到下面留言表單填資料,可以確保隱私。

https://forms.gle/6hkADMMmLayjY1TA9


留言

匿名表示…
網誌管理員已經移除這則留言。
匿名表示…
網誌管理員已經移除這則留言。
Unknown寫道…
網誌管理員已經移除這則留言。
DogFather寫道…
Hi, 電波兄

小弟我公司也正在進行turnkey的開發,目前卡在列印證明聯上,不知 電波兄 是否可以分享你的部分code供小弟學習.
WILDOX寫道…
Re: 宗雄陳 <5562221134482932967>
您好,抱歉工作忙碌今日才回,若您需要原始碼,請給我可以寄送的電郵信箱,我會寄發給您的
目前原始碼只給私訊喔,謝謝
Unknown寫道…
hi 電波哥

也方便跟您要下code嗎?感謝.
匿名表示…
Hi, 您好, 方便跟您要個code嗎? 或是網路上是否有相關.net 電子發票 code範例可參考, 找了一陣子, 都看不到可踏出第一步的資料, 感溫!!
WILDOX寫道…
Re: 匿名 <5276640549239078381>
您好:我已經回信給您囉
WILDOX寫道…
Re: huang jen wang <2669284891016057027>
您好,很抱歉,可以給個信箱嗎?因為目前不公開,但我可以email給您
WILDOX寫道…
Re: Unknown <6444599758475234201>
您好,很抱歉,可以給個信箱嗎?因為目前不公開,但我可以email給您
WILDOX寫道…
Re: huang jen wang <925088204537523345>
您好,已經回您了喔
WILDOX寫道…
Re: Simon Hou <1366410652103888819>
沒關係,已經回給您囉
Unknown寫道…
網誌管理員已經移除這則留言。
匿名表示…
你好~
這個發票很程式很有幫助~我也遇到發票列印的問題~
可以提供原始碼嗎~
非常感謝~
我的email: andyxiechen@gmail.com
WILDOX寫道…
-------------------
^^^^^^^^^^^^^^^^^^^
此線以上已回信.....
匿名表示…
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!
匿名表示…
網誌管理員已經移除這則留言。
Unknown寫道…
請問可以連續印多張發票嗎?還是一個XML只能印一張?
gsc0210表示…
網誌管理員已經移除這則留言。
WILDOX寫道…
Re: Wang D.J. <542587048530393705>
Hi Wang D.J. : 這個XML一次只能一張喔..
Unknown寫道…
電波兄,先謝謝你上次分享程式.我這邊遇到一個小問題,就是透過小程式列印的發票會抓取當天日期,若要列印之前日期的發票是否有辦法?ex20170926列印20170812開立的發票
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的方式
如果需要自己定義列印時間,那就把它恢復吧
Unknown寫道…
希望也能取得源碼,研究探討一番
WILDOX寫道…
Re: 呂美蘭 <5443695574500423684>
Hi 請問有郵件嗎?我可以寄檔案給你
匿名表示…
您好:
因為我們公司希望自建TURNKEY,在列印證明聯的QRCODE是要用圖檔列印
但無法達到左右兩邊的QRCODE尺寸大小一致,可否請您分享一下您的程式讓我參考學習.
謝謝
e-mail: amy1108.yang@msa.hinet.net
WILDOX寫道…
Re: 匿名 <9165127048254945784>
QR code 本身會受到內容影響大小的,所以建議您把每個QRcode內容定在128byte
這樣會讓它的大小固定,內容不足的部分就以空白替代是可以的。
WILDOX寫道…
Re: 黃銘毅 <3069496163262425774>
您好,您的信箱無法寄送,出現『未知的收件人』喔

遠端伺服器的回應如下:
550 5.1.1 : Recipient address rejected: User unknown in relay recipient table
Unknown寫道…
您好,非常感謝您提供您的程式
小弟目前在開發Web POS系統(PHP),需連結發票機印出電子發票
正苦惱多時,剛好看到您的文章,讓我看到一道曙光
C#不是很熟,不知道能否跟您討要Sorce Code研究
另外不知道您知不知道怎麼用php結帳時傳值然後呼叫小程式列印?
我的信箱: a0935756869@gmail.com
非常感謝您!
匿名表示…
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的原始碼到本地電腦,並且編譯程式,並發佈到手機上,使用的也是這種原理。

※還是要提醒您,第二種方式現在常見於各大免費空間網站,要求你下載一個程式(有時候會偽裝檔名成為你要下載的檔案)然後才能繼續下載你要的檔案,這個是很可怕的漏洞,因為有的會去綁架首頁、安裝廣告軟體、或是開通本機偽協定讓各大駭客網站可以以自由進出你的電腦等...
Unknown寫道…
非常感謝Simon Hou和WILDOX提供的方式
兩種方式我都會研究試試看
有遇到其他問題在向你們請教
匿名表示…
To 蔡世珉、版主:
看到蔡Sir寫開發Web POS系統(PHP), 應該是指user端的pos機用的, 想到有公司開發出使用php.exe執行背景服務Listen 到如http://localhost:***(不用在本機安裝網站及php), 然後使用上面那個提到的php printer原始碼來達到本機列印到Thermal printer(com port, driver, usb, api等等連接模式) , 不熟php, 只是最近研究發票機時有看過。
HouHou寫道…
作者已經移除這則留言。
HouHou寫道…
您好 我是中原大學資工系的學生
因為專題跟電子發票有關
現在也卡在列印發票證明聯的部分
能否跟您要個Source Code作參考嗎?
信箱:s10427221@cycu.edu.tw
感謝您
匿名表示…
Dear 版主,
有個問題請教一下, 電子發票有規定長度得9公分, 但一般熱感機上面裁刀跟下面印字頭有一點半公分,變成每次印完上頭會有一點半公分空白, 讓下面發票資訊排版較不易, 不知你知曉如何解決這個問題嗎?

感溫!!!
WILDOX寫道…
Re: Simon Hou <2563382749646336319>
您好,要解決這個問題有兩個方法:
1、更換印表機,找裁刀上方留白處比較小的機種,這可能牽扯到比較多層面:廠商技術、設備成本、採購問題等等。
2、捨棄版面下方3行資訊不要列印,可以多出這1.5公分,你去看7-11的版面就是這樣(上面一片空白),當然程式要修改,每一行的列印位置Y軸加上下移的長度,並且把最後3行列印程式碼拿掉即可。
WILDOX寫道…
Re: Simon Hou <2563382749646336319>
注意一下,上一個回覆的第2點,可能會受到印表機的『起始列印位置』影響,如果裁刀下1.5公分是包含在9公分以內,是需要按照上述方式修改程是列印位置的Y軸的。『但是』如果廠商這個1.5公分空白不包含在9公分的版面內,那程是修改方式就要不一樣:
1.實際列印空間被削去只剩9cm-1.5cm=7.5cm,你要調整畫布大小高度只有7.5cm,然後每一行列印Y軸『不用變更』,只需要『刪除最後3行列印』即可完成。
您還是要實際測試一下您的印表機特性才可以。
匿名表示…
Dear 版主,
1. 的確不同機器會有不同留白處, 目前測是epson tm-t88ii是最少的1.1cm, 也有其他的長逹1.8cm
2.想要利用那留白, 業者好像都是以裁完後先預印下一張NVLogo方式, 這樣就可以少掉動態載入LOGO地方, 不然就得看原廠是否願更訂firmware成裁完退紙了

感溫!!!
匿名表示…
Dear 版主,
剛關於第2點預印logo方式測試好像也沒用, 位置仍是在裁完後的印字頭位置。
看來只剩原廠更改firmware一途和找留白較少點的機器。
WILDOX寫道…
Re: Simon Hou <2239115132370266792>
感謝Simon Hou大的經驗分享,不過依照我的經驗應該不太可能『預印』,因為那是機器的『gap』...
我看過之前(會說之前是因為現在很少看到了)有廠商做出有紙張定位的機種,但缺點是這紙張兩側有黑色MARK,但是因為市場太小,可能已經被淘汰了,這樣可以減少定位gap浪費
WILDOX寫道…
Re: Simon Hou <8533969103332989102>

HI,Simon Hou,依照我的經驗有的機器可以利用更改驅動方式達成不見得要改韌體,像是第三方驅動 Seagull 公司,他們家的驅動可以強迫減少邊界Gap(比原廠還要窄的邊界,半沒辦法100%取消邊界),但該公司驅動不見得所有機型都支援。屬於一種可選方案。

另一種,我曾經在精聯看過代理的機器(我忘記牌子),可以『roll-back』紙張到紙張上緣邊際,然後再列印,不過缺點是會變慢,價格也不便宜。

所以設備廠商為了減少機構複雜度(也可以減少成本/維護)、增加列印速度,所以一般機器只會做出Forward方式列印,因此會犧牲掉這個上緣Gap空間。

早期點陣印表機也有這個上下Gap,而且無法取消,其原因在於當紙張進入"滾筒"時需要有個固定輪來壓住紙張,從這個固定輪到出紙口的斯紙線之間,就會出現一個距離,這個距離就是印表紙的上緣『定位間距』。因此當紙張比較薄時會因為靜電效應或是長時間捲曲服貼於滾筒上,利用上緣出紙的GAP固定到出紙口,可以確保紙張不會因為服貼滾輪而從入紙口的上方再捲回去,造成紙張咬死致使機器損壞。
WILDOX寫道…
Re: Simon Hou <2239115132370266792>

那個NVLogo方式可能不是『預印』,而非常可能是『套印』,也就是紙張上先印好LOGO位置,因為印表機GAP是『無法列印』的,因為他的會用的指令是『Feed』而不是『print 空白行』。

套印的方式,目前要搭配特定機種指與紙張,因為現在埔集的發票紙捲,普遍是『無定位mark』,所以實際上紙張最後會停在『哪個位置』是不一定的,而且在應用上『無定位mark』紙捲比較彈性,例如家樂福列印發票時,可以順便列印『明細』也是在同一捲紙捲上,而且明細會因為實際情況常短不一,不需要另外更換紙捲或是再準備一部印表機印明細,節省公司成本。
patrickuo表示…
版主您好,
我們公司自建Turnkey與公司使用的ERP整合,
目前正在為電子發票列印程式頭痛,
可否提供您的程式碼做參考,
非常感謝。
EMail:patrickuo1028@gmail.com
Unknown寫道…
電波大大 您好
我目前也在用PB開發電子發票列印
可否也寄給我原始程式讓在下參考一下寫法,
非常感謝,謝謝
E-mail: csecsv@hotmail.com
Unknown寫道…
To 蔡世珉、版主、Simon Hou:

web POS 系統方式,會如同Simon Hou 說的模式比較適合,建議在local端跑php 的service,去執行,這樣全部的執行過程都會在local本機上運作。如果想透過網頁呼叫本地端的PHP執行,可以搭建伺服器配合或是使用PHP內建的server(build in server)來達到。另外不同的OS有不同的使用方式,操作模式依據外接printer的port不同,會有各種不同的IO使用方式。最近研究的一些小心得分享一下。

但我自己遇到的部份是要如何輸出雙QR code,因為目前我只有測試到可以印出單QR code,無法在同一行上輸出多個不同的內容,希望可以跟版主索取您的程式碼研究這一部份。

我的信箱 pencil722@gmail.com

謝謝

WILDOX寫道…
Re: 陳明華 <5061323992142948025>

感謝您的經驗分享,信件已經寄出
一行只能輸出一個QR code問題應該是使用印表機指令比較常見問題,
C#是採用畫布製作比較不會有這問題。
若是印表機指令無法提供多QR code產生在同一個列印列上,就得找其他方法解決了。
Unknown寫道…
To 版主:

先前提出的問題,一行無法輸出多個QR code,後來經過測試後,發現要先切換到page mode,接著就可以指定列印區塊列印方向等等,進而客製想要輸出的內容以及位置。提供給大家參考。
匿名表示…
版主您好,
我剛開始學c# ,想製作電子發票,但毫無能力,
希望您可以分享您的統一發票列印小程式 source code,
讓我有機會學習,
真的非常感謝!

Email: jennycomes@outlook.com

祝 新年快樂!
WILDOX寫道…
Re: 陳明華 <1035989337931158525>

嗯嗯,原來如此,謝謝
匿名表示…
Dear 版主,

對於之前提到上頭留白之議題, 研究結果是:
1.更訂firmwave方式: epson、star熱感機 安裝程式有提供省紙模式可將上頭及下頭留白省掉剩一點點, 另 partner熱感機 也提供firmwave直接更改上頭留白長度。
2.esc/pos方式: 在pagemode下送出打印命令印出整張發票後, 續接印圖案(或是打印NV LOGO), 再送切紙命令, 這時就會切在圖上頭, 也就變成下一張發票的圖預印在原上頭留白處了。
WILDOX寫道…
Re: Simon Hou <825416681257468796>

看來,這就是Windows驅動列印和直接指令列印的區別了,Windows驅動列印會把整包列印資訊送去列印後,再由韌體判定列印完畢送FEED指令把紙張推進到裁切區。此時『向前推進』就會造成GAP了。

然而ESC/POS指令可以不必告訴韌體『列印完畢』,也不必在裁切前『向前推進』,直接下達指令處理,可以很快,可以無視『紙張長度』概念,可以做到比較『細緻』的動作。
Gerry寫道…
樓主有研究過Web Printing的方式了嗎? 我寫過用ActiveX方式控制了
但畢竟一定要用IE,目前也研究了HTML5 Canvas, JavaScript + Applet等等
但範例都不足, 而且未來IE也不支援ActiveX了, Chrome也將Java Applet
的移除, 所以除了HTML5 Canvas,不知道還有什麼方式可以做到Web Printing,
如果方便可以一起交流~謝謝。

gerryz@gmail.com
WILDOX寫道…
Re: Gerry <5009505151456777398>

您好,gerryz :
這個概念我是有研究過的,前面有幾位網友像是 Simon Hou、蔡世珉、陳明華
有回答這個方式,就是利用本機的 web 服務來處理
它的概念如下(流程圖):
https://drive.google.com/file/d/1zZJShokeYkGO85m4bcY_fDWGVYk-WXGu/view?usp=sharing

首先,使用PHP之類的程式(或自己撰寫WinSocket監聽服務)來啟用​本機的服務監聽,例如服務埠在 8888,在這裡面有一個可以接收POST上傳的 page 或是applet,當這個page或是applet接收POST上來的資料後,直接操控本機印表機,送出列印資訊。
因此,流程會如下:
1、當使用者需要列印發票時會透過瀏覽器向四發器發出請求(例如是表單submit/或是ajax post)。
2、伺服器返回發票要列印的相關訊息(資料)
3、瀏覽器接收到資料後轉發資料post到本機服務 http://localhost:8888/printlab.....(假設)
4、本機服務器接收到資料以後,由於是在本機(地),所以可以直接控制列印,此時就可以利用Win spool或是ESC/POS方式列印

因此,本地機器基本上要安裝這個本地HTTP服務最好是安裝成Windows服務形式且自動啟動,如果不是Windows服務形式的話就要使用者每次列印前要啟動這個HTTP服務。
這種方式目前是很多人用的方式,我舉過的例子像是 http://ai2.appinventor.mit.edu 本身就是利用這種方式來作到雲端開手機APP的方式。
Unknown寫道…
請問,關於24碼加密的部份,您是自行開發,還是使用國稅局的元件呢?
WILDOX寫道…
Re: Wang D.J. <5905131883486711289>

這部分要用國稅局的API去產生出來喔,因為HASH用的KEY在國稅局的程式裡面啊,一般是拿不到的。
匿名表示…
不知我對於電子發票整合服務平台加解密API使用說明書理解對不對,
1.營業人先登入財政部電子發票整合服務平台取得密碼種子,
2.再從服務平台的常用文件下載中下載電子發票QRCode說明文件.zip, 裡面有genKey.bat這支批次檔,
3.執行後輸入第一項的密碼種子, 即會執行同一資料夾裡面的geinv-kms-dist-1.0.1.jar中的com.tradevan.geinv.kms.dist.GenKeyWorker這個當初大平台開發者關貿用java開發的程式(GenKeyWorker.class), 再產生出QRCode要的營業人加密金鑰
4.並以此金鑰自行以AES加密演算法來加密資料。大平台再以營業人密碼種子反解出資料。
WILDOX寫道…
Re: Simon Hou <6328775570637328941>

前面3點大致沒問題,問題在第4點:
『自行以AES加密演算法來加密資料』
如果完全要以自製AES加密器除了KEY值你還會缺少IV值(初始化向量),因為我也不知道IV哪裡來。

建議你參考『電子發票整合服務平台加解密API使用說明書v1.12.pdf』(在電子發票QRCode說明文件(V1.6))裡面提供的方法:
財政部有提供DLL元件可以使用,輸入相關資訊(包含你的KEY)即可產生QR碼前面77碼(包含裡面的24碼加密)都是透過這DLL產生,比較保險與安全,文件裡面也提供了C與C#範例可以使用,相當方便。
匿名表示…
TO 版主,
該附件在 第伍章、參考用原始碼 檔案: tw\gov\nat\einvoice\qrutil\QREncrypter.cs
不是就有QREncrypter.DLL這支API的原始碼?跟反組譯後是一樣的。
Unknown寫道…
AES 加密的確是需要 iv 值,這點國稅局文件並沒有提到,但確實藏在國稅局提供的 Source Code 裡面,iv 值="Dt8lyToo17X/XkXaQvihuA==",我原本在 pl sql 裡面一直試不出來,發現這個祕密之後,加上 iv 就 pass 了。

( private final static String TYPE_SPEC = "AES";

/** The INIT type. */
private final static String TYPE_INIT = "AES/CBC/PKCS5Padding";

/** The SPEC key. */
private final static String SPEC_KEY = "Dt8lyToo17X/XkXaQvihuA==";)

版主可給我您的 Source Code 嗎?我需要把 Print Time 改掉,或是您已經有改過的版本?可以給我嗎?感謝!

djwang3388@gmail.com
WILDOX寫道…
Re:Wang D.J.<6089986900002208332>

感謝Wang D.J.提供的訊息
WILDOX寫道…
Re: Simon Hou <5479965096484340127>

下面Wang D.J.的回答是否能提供您一個研究方向,我是沒反組譯過所以無法回答您,抱歉
匿名表示…
版主 您好,最近公司也在自行開發電子發票列印的東西遇到了一些列印的問題可否向您索取Source Code來研究一下?感謝
f1241766@gmail.com
Gerry寫道…
感謝版主之前回覆了Web Printing的概念,讓我有了新的Idea,目前正使用HTML5+WebSocket
的方式來達到Web Printing,待我完成了再與大家分享~
oudex寫道…
一直苦腦 Vb6 寫不出來,如果有此方法也可以解決
麻煩大大給份 Source Code 參考,感激不盡
jack.oue@gmail.com
WILDOX寫道…
Re: Gerry <3581423260227649838>

謝謝囉
Unknown寫道…
版主好:
程式以雷射印表機印出來,非常完美,但改到熱感紙印表機之後,整個內容被等比例縮小,導致 QR_Code 無法辨識,看起來像是印表機左右有強制留白的緣故,請問有解嗎?
WILDOX寫道…
Re: Wang D.J. <3030630762559803888>

列印比例出問題,通常比較會出現在印表機的紙張設定,如果您是『滿版列印』請調整印表機邊界到滿版,如果沒辦法,請廠商提供修改過的驅動程式或是使用第三方相容驅動程式,像是bartender有提供seagull驅動相容許多熱感印表機的驅動,該廠商區動可調邊界比原廠精細許多。
其二,印表機驅動設定是否有類似 fit to fill 或是 fill to page 這種『壓縮列印』,如果有請取消。
其三,如果上數都無法著手,就得從列印的版面下手,縮小列印版面(原底圖大小扣除無法列印的邊界),再去繪製圖文。
其四,像前面Simon Hou大留言的做法,他也是遇到紙張裁切發生的空白問題,最後請廠商修改調整Frameware才能處理了。
WILDOX寫道…
Re: Jack Ou <420048378954411786>

提供給您了,但是我的Source Code是C# .net,而您用的是VB6,開發工具與概念會很有差異性喔
匿名表示…
你好,我目前發票列印功能都已做好了,可是一維條碼的部分,我的BarCode Reader一直讀不出來,我有嘗試使用過您另一篇文章的字型產出條碼(C39P24DhTt),但還是掃不出來,想請問您這方面是不是還有其他細節是需要注意的?
Unknown寫道…
電波大大,

懇請您提供原始碼給我,非常感恩!謝謝!
leew777777@gmail.com
Unknown寫道…
您好,
請問一下,若列印完成後之裁切(因明細長度不一),
是否需用ESC/POS指令?或是有其他方式?謝謝~
WILDOX寫道…
Re: 黃煥松 <4636315957773429264>

裁切功能不屬於列印功能的特性,一般的列印指令並不支援,所以在C#裡面的PrintDocument沒有這種功能,如果要實現裁切動作,則必須使用印表機專用指令(ESC/POS就是其中一種)、第二種就是廠商驅動程式內提供的設定中有當指張列印完畢後的裁切功能設定、第三種是廠商另外提供的可呼叫批次程式(提供定功能)方式處理
WILDOX寫道…
Re: 匿名 <5182741802854588743>

這個條碼問題會有點複雜,首先瞭解這個發票用的條碼資訊長達 19 字元,在這種情況下條碼要塞進9公分寬度,加上左右至少要保留0.4~0.5公分,所以使用字型產生的條碼是沒辦法塞進去的,如果過度調整字型大小,會導致條碼粗細比例錯誤,導致無法掃描出來,所以我的做法是捨棄字型式的條碼,採用繪製方式重製條碼才不會有問題。
匿名表示…
電波大你好,那我再請問一下,你繪製的意思是用Zxing.dll的方式做出一維條碼的嗎?
還是是使用其他方式?
因為我有試過Zxing.dll方式產出,但感覺條碼還是有沾黏的情況發生
如果方便的話可以用信件跟你討論這個問題嗎?
Email:ases11002@gmail.com
WILDOX寫道…
Re: 匿名 <7869700100876670542>

不,
在這個案例裡面,我沒有使用 Zxing 來產生一維條碼,我使用Zxing 是用來產生QR碼的
我產生一維條碼方式是用執接繪製處理
Code39碼本身並不複雜,不管是透過運算方式還是 預定義 方式都可以製作,
我個人選擇預定義方式,加快程式運行速度,我利用程式碼裡面518~617行的函數產生條碼圖形,再貼回主要繪製區
Unknown寫道…
Re: 黃煥松 <4636315957773429264>
感謝,將以ESC/POS 裁切
Nickcat Wang寫道…
嗚嗚嗚,搞了半天都弄不出來,好不容易找到您的blog
可以厚著臉皮跟您申請一份source code嗎?
小弟的email: nickcatwang@gmail.com


樓主好人一生平安 感謝大大無私的分享~
QQ寫道…
您好,想請教一下大大
關於程式裡面ItoC這個變數的值是怎麼來的呢?
為什麼要設定成2.54來算寬跟高?
直接經過多次測試來取得最佳的寬跟高會比較沒效率嗎?
WILDOX寫道…
Re: 汪澤政 <6814895552941570474>

Hi 您好:

ItoC 就是 inch to cm 的縮寫 = 1英吋 = 2.54 公分 的意思
喔~~
匿名表示…
感謝版主的無私發表,目前也在導入電子發票,雖然使用別人以完成的DLL,
但也希望自己可以研究一下,所以拜求格下的code參考一下,謝謝!!
請寄jeffwang@ms1.url.com.tw
匿名表示…
剛接觸熱感列印機
希望能夠參考一下,感謝
frank.chen@rocketman.ninja
謝謝
Unknown寫道…
大大您好! 感謝大大分享程式,

目前在開發電子發票的程式,

照著電波大大的說明,已可整合使用,

但USER需要再修改,所以可否請大大,

提供source code 給我做參考,感謝!

petermin1000@gmail.com
Unknown寫道…
大大您好,最近需要研究發票列印,不知道能不能提供原始碼參考,
可以的話這是我的信箱:forever84721@gmail.com
先感謝大大無私的分享,祝大大一生平安
Agrace寫道…
首先感謝大大無私的奉獻 讓我這小的碼農受益良多
因為我們公司喜歡甚麼都自己搞一點
最近也在研發列印電子發票
不知能否向也您要原始碼參考
勢必能少掉些撞牆期

我的email: grieg1@gmail.com

感謝 順心
Tommy Wang寫道…
很感謝有您分享的原始碼,讓我5/1號電子發票可以正式上線。
WILDOX寫道…
Re: Agrace <5001541687049954872>

恭喜您啦,跟我們公司一樣,所以要當IT超人喔~
WILDOX寫道…
Re: 王朝慶 <5038713952409876903>

不客氣呦~
WILDOX寫道…
Re: 匿名 <1158884232996556678>

Hi~ 廠商提供的DLL列印方式和我的Windows Print Driver有很大出入喔,要注意
Unknown寫道…
下列有廠商提供電子發票列印SOURCE COD,可參考。
http://www.goldencode.com.tw/download.html?CNo=15
WILDOX寫道…
Re: huang jacky <8324162071017742504>

謝謝huang jacky的提供,因為那是VB 開發的,我沒有VB工具所以無法一窺其究,不過還是可以給其他網友研究研究。
Simon G900寫道…
hi 電波哥

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

WILDOX寫道…
Re: Simon G900 <5883307840927019412>

Hi Simon G900,請問我要怎麼寄給您呢?
Unknown寫道…
您好,可以方便參考您的CODE嗎?我是用「windows印表機名稱或IP」的方式處理,可是印出來都很奇怪,希望可以參考><。這裡留下我的Email 非常感謝
hpc86316@gmail.com
匿名表示…
您好,目前在開發一款自助服務的機子,正在研究電子發票
能否提供原始碼呢?謝謝
第一次使用blogger這平台,用google帳號登入您看得到email adress嗎?
unknown寫道…
您好,目前在開發一款自助服務的機子,正在研究電子發票
能否提供原始碼呢?謝謝
email: shop.abercrombie01@gmail.com
不好意思,上面不熟blogger 留言身份重複發了
WILDOX寫道…
Re: unknown <5773255330916398711>

您好:
可以喔,已經回覆給您了。
Unknown寫道…
您好:

請問,我是使用 a4紙列印,同一張紙上面會有發票與明細,已成功開發出來,但有個問題是如果明細資料太多,會直接截掉,無法列印第二頁,請問有解嗎?
WILDOX寫道…
Re: Wang D.J. <6257377025646948599>

如果繪製Graphics會大於印表機單張用紙大小,你可以先檢查印表機最大高度與你要繪製Graphics的總高度,
在列印完第一張(PrintPage事件)最後,設定 PrintPageEventArgs的屬性HasMorePages為true

e.HasMorePages = true;

告知PrintDocument要繼續列印即可,

但是,如果你每頁都要重製標題或是外框就不適用,必須為第二頁重新建立第二次的PrintDocument

你可以參考 https://stackoverflow.com/questions/18814493/how-to-jump-to-the-next-page-in-a-printdocument
WILDOX寫道…
Re: 怡諭 <1204283607518972652>

您好,信已經寄給您了

關於 WEB列印方式,其實有其限制的,因為有以下原因:
一、瀏覽器無法直接控制印表機,無法精準定位列印
二、瀏覽器各有其特性,對於列印控制設計有太多不相容因素,設計過網頁的工程師都知道,光是DOM解釋方式,IE、FF、Chrom、Safari、Opera都有之末細節不相同特性,設計版面就累死了。

若以目前的技術來說,較可行的方式,就是利用本機的 web 服務來處理
它的概念如下(流程圖):
https://drive.google.com/file/d/1zZJShokeYkGO85m4bcY_fDWGVYk-WXGu/view?usp=sharing

首先,使用ASP.Net Core / PHP之類的程式(或自己撰寫WinSocket監聽服務)來啟用本機的服務監聽(例如服務埠在 8888),在這裡面有一個可以接收POST上傳的 page 或是applet,當這個page或是applet接收POST上來的資料後,直接操控本機印表機,送出列印資訊。
因此,流程會如下:
1、當使用者需要列印發票時會透過瀏覽器向伺服器發出請求(例如是表單submit/或是ajax post)。
2、伺服器返回發票要列印的相關訊息(資料)
3、瀏覽器接收到資料後轉發資料post到本機服務 http://localhost:8888/printlab.....(假設)
4、本機服務器接收到資料以後,由於是在本機(地),所以可以直接控制列印,此時就可以利用Win spool或是ESC/POS方式列印

因此,本地機器基本上要安裝這個本地HTTP服務最好是安裝成Windows服務形式且自動啟動,如果不是Windows服務形式的話就要使用者每次列印前要啟動這個HTTP服務。

這種方式目前是很多人用的方式,我舉個例子像是MIT麻省理工學院有製作一個雲端開發手機app的方式( http://ai2.appinventor.mit.edu),但是雲端開法程式與編譯後如何傳給手機安裝呢?就是透過它提供的一支本地端程式來接收雲端編譯好的app程式,當雲端編譯好後會submit一個本地端的url(像是http://localhost:8899/serverlet/compile-finish.......這樣呼叫)觸發這支本地端服務程式,然後這支服務會從網路上把檔案下載並把APP上傳到手機上的方式。
Unknown寫道…
版主你好,
我現在在設計一個智慧型自動販賣機
需要能印發票
可不可以請你把程式碼寄來讓我參考一下
如果可行, 我們想請你幫我們寫需要的一些功能

謝謝


WILDOX寫道…
Re: Unknown <4683929942651895128>

Hi~你好,這個沒問題,但是我不知道要怎麼寄給您喔??
請問有電郵信箱嗎?
匿名表示…
您好:

您的程式太棒了,希望能索取原始碼進一步研究學習。

cpc.jorchan老鼠gmail點com

感謝您!
WILDOX寫道…
Re: Unknown <5964146558631054626>

已回覆,關於電子發票資訊建議去財政部的關網去查會比較正確,
因為財政部網站頻頻改版,導致原本連結已經無效,我這裡先提供目前的連結
https://www.einvoice.nat.gov.tw/ein_upload/html/ESQ/ESQ101W.html

給你參考,裡面有蠻多文件可以下載
WILDOX寫道…
Re: 張元瑋 <5260057312406030164>

如果不是電腦本科的,會看的比較辛苦呢。
不過,有志竟成,我一開始也不是本科的喔,
我是電子科的,最後變成程式開發人員,
我也有學長是企管的,也是變成很強的程式設計師

還有,Gmail的信箱 沒有 .tw 的喔
WILDOX寫道…
Re: 匿名 <7711509739733417164>

您好:
您的郵件信箱我寄不出去喔:
"
找不到地址
系統找不到 noahrk169@hotmail.com 或該地址無法接收電子郵件,因此未傳送你的電子郵件。
"
WILDOX寫道…
Re: Angela <4064231879223696015>

您好 Angela,我在10/03上午9點多有寄過一次給您囉,10/22也有再寄一次,請查看您的垃圾郵件,看會不會被檔掉了喔
General寫道…
您好, 開發電子發票時碰到不易識別的問題, 可否提供SourceCode以供參考呢?感恩您!
WILDOX寫道…
Re: General <3192596676305804800>

您好,您沒有留電子郵件我不知道怎麼回覆您喔
William Hsieh寫道…
電波兄: 你好!

我想請教有關QR碼內容最多120BYTE長度, 這限制是電子發票法規上的要求, 還是這支程式內給予的變數長度設定, 還是其他原因?

William Hsieh 2020/02/18
Kevin寫道…
您好
不知道是否可以取得您的原始碼,真的很感謝。
已填索取函

kevin
WILDOX寫道…
Re: kevin
您好,透過表單已經回覆給您
SUE寫道…
您好,已填好表單 再麻煩你提供參考 謝謝 ^^
SUE寫道…
網誌管理員已經移除這則留言。
SUE寫道…
網誌管理員已經移除這則留言。
WILDOX寫道…
您好,SUE,已經回信囉
Unknown寫道…
Hi, 板主您好:

小弟目前也在開發電子發票證明聯,開發環境正好與您相同;
是否能跟您索取原始碼來運用呢? 非常感謝!

ps. 您這篇文章及相關討論應該幫助了很多人,
感謝您對電子發票導入的貢獻! ^_^
sieg寫道…
電波哥 您好.
最近小弟也在研究電子發票, 方便提供您的source code參考看看嗎?
小弟email sieg343501@gmail.com
感激不盡!
howard表示…
電波哥 您好.
最近在開發電子發票相關套件, 希望能獲取您的source code參考
感激不盡!
已在表單中留言,感謝。
phoenix771228寫道…
版主您好,最近我也在開發發票的列印程式,希望能參考您的Source,會在表單中再填寫一次,感謝您
vincent寫道…
版主您好,最近我在開發發票的列印程式,希望能參考您的Source,感謝您
vincent寫道…
版主您好,最近我在開發發票的列印程式,希望能參考您的Source,感謝您
vincent寫道…
版主您好,最近我在開發發票的列印程式,希望能參考您的Source,感謝您
WILDOX寫道…
vincent 您好:
因為不知道貴方的電子郵件不知道如何寄給您喔...
希望可以留下電子郵件信箱以方便連絡。

如果您不希望電子郵件在留言中被大家看到(畢竟是公共區域),
您可以到文章最下方連結的表單裏面填寫資訊喔!!
WILDOX寫道…
作者已經移除這則留言。
WILDOX寫道…
趙先生您好:
您留的電子郵件,無法寄達,GMAIL通知說『無此收件人』,

>>
>>找不到地址
>>系統找不到 b------1@gmail.com 或該地址無法接收電子郵件,因此未傳送你的電子郵件。
>>

請您再填一次表單,併確認您的電子郵件信箱沒有填錯喔
Esther寫道…
您好
不知道是否可以取得您的原始碼,真的很感謝。
已填索取函
Esther寫道…
你好 請問可以詢問您
我用VS2015 C# winform 還有zxing 寫了一個印單據的程式,
其中將qrCode 轉為圖檔在抓出圖檔轉為byte列印出來都會是亂碼,
請問是我思路哪裡不對嗎?
WILDOX寫道…
Esther 您好:
由於不知道您的程式碼如何寫?
產生的畫面如何?
無法能夠準確回答。

1.但是如果您產出QR碼已經不正常,那轉出的圖檔也是不正常。
2.如果QR碼正常,輸出圖檔不正常,那就是轉換圖檔案使用了錯誤的處理方式。
Rick寫道…
版主您好 最近正在鑽研發票相關議題 方便參考您的code嗎
email是arst8325746@gmail.com
非常感激!
weimin寫道…
版主您好 剛好需要鑽研發票相關議題 方便跟您索取code嗎
email是weimin.peng@abocom.com.tw
非常感激!
匿名表示…
版主您好 最近工作需求需要做電子發票
我看板主的程式也是使用C# 和 使用Zxing 撰寫
而我是使用crystal Report,但是目前程式使用Zxing產生出來電子發票聯的左右QRCODE
大小都會不一樣的情況發生,不知道是否可以取得您的原始碼,做後續程式修改的參考
已填索取函 謝謝您
匿名表示…
版主您好 最近正在鑽研發票相關議題 方便參考您的code嗎
email是jerry22342093@gmail.com
非常感激!
WILDOX寫道…
Dear jerry22342093 :
我寄囉
arnold0114寫道…
版主您好:

因為有特殊字的需求,想自己弄一個unicode的XML編碼,是否可以和你要一下source code感恩。

email:arnold0114@gmail.com
WILDOX寫道…
Dear arnold0114:
我寄囉
Isonso寫道…
電波大大

我也想要您的源碼
我的mail是isonso@shy.idv.tw
截止區寫道…
版主好
最近有需要了解發票這塊議題
是否能夠參考您的code,謝謝
email:htcbill123@gmail.com
再次感謝!
匿名表示…
版主您好
最近在開發電子發票
目前也在研究列印發票的部分
是否能夠參考您的code
謝謝
20210312
WILDOX寫道…
哈囉,記得使用表單填寫資料喔,這樣我才能看到喔
Bear表示…
您好.昨天有填單,再麻煩留意一下,感謝
mr 500寫道…
hI 電波先生你好,

近日恰有需要列印電子發票,看到您的文章覺得剛好合乎需求,能否請您提供SOURCE CODE給我參考呢?感謝!
寒駿寫道…
電波兄您好,我也是在苦惱如何把發票列印到發票機上,請問可以看看你的 source code 學習應該如何寫嗎?

謝謝。
WILDOX寫道…
mr 500 / 寒駿 你們好:

您可以到網頁下方有個連結到Google文件,填上您的郵件與相關資料後送出即可回寄給您,謝謝
寒駿寫道…
電波兄你好,我看不見有連結啊。

雖然已經自行用印單機指令成功印到符合規格的發票,但也想觀摩另一個可能性。😆
mark寫道…
作者已經移除這則留言。
WILDOX寫道…
嗨 各位:

網頁最下面有這個連結,可以到 Google問卷填寫資料喔

https://forms.gle/6hkADMMmLayjY1TA9

Unknown寫道…
正在苦惱如何把發票列印到發票機上,想看看你的 source code 學習應該如何寫
已填索取函
Aki寫道…
您好. 最近也在研究電子發票, 方便提供您的小程式嗎?email juneaki28@hotmail.com 感激不盡!
WILDOX寫道…
Aki 您好:
已回信囉
Unknown寫道…
您好
希望可以提供原始碼
我的email: bnc4193@gmail.com
非常感謝
艾德 里奇寫道…
晚安,

您好,小弟最近也在研究這方便的資料,
希望您能夠提供原始碼讓小弟能夠更深入了解,

謝謝您。frank.shieh@gmail.com
Ying寫道…
WILDOX您好,
最近也在研究電子發票列印功能,
希望也可以參考你的程式,
感激不盡!

email: a310832@gmail.com
Taylar寫道…
希望能參考您程式 感謝
Mail:taylar.chen@gmail.com
希望可以參考您的程式. 謝謝
MAIL: lilan588@hotmail.com
Unknown寫道…
您好:
我最近也開始研究如何在WebPage中產生電子發票內容最後輸出列印在發票熱感機,
可是我的觀念一直認為是瀏覽器要輸出列印內容應該是瀏覽器的列印功能控制印表機,
可是看到您的文章發現有另一個方式,真是太棒了!
是否可以您索取原始程式碼來研究看看!!
另外如果我的裝置是使用IOS、Android的平板電腦,請問可以適用這個方式嗎?
我的信箱:antai591005@me.com
LouisYeh寫道…
您好,最近再研究Winform列印單據的功能
看到此篇文章進行程式的測試列印
結果非常理想
想跟您索取原始程式碼做修正
謝謝您
Richard寫道…
希望可以參考您的程式. 謝謝
MAIL: silungan@gmail.com
joe寫道…
您好,看到此篇文章進行程式的測試列印
結果非常理想.
想跟您索取原始程式碼做修正
謝謝您!
xiaohe2002@gmail.com
Johnny寫道…
你好我在開發印電子發票的程式,懇請大大發一份demo程式碼給我,非常感謝
johnny.taipei@gmail.com
匿名表示…
您好,我在開發印電子發票的程式,懇請您提供原始程式碼給我,非常感謝
Wayne寫道…
您好,感謝您熱心分享,懇求您提供原始程式碼給我學習,非常謝謝
humiohsieh@gmail.com
sam寫道…
您好,小弟最近也在研究這方便的資料,
希望您能夠提供原始碼讓小弟能夠更深入了解,

謝謝您。hocy168@gmail.com
匿名表示…
您好
感謝您分享電子發票列印小程式
懇請您提供原始程式碼,感激不盡^^
asgardtest2023@gmail.com
AV寫道…
希望能參考您程式 感謝
Mail:ffuitw@gmail.com
Bt寫道…
您好,最近也再研究這方面的程式但網路上實在沒什麼資源
希望跟您索取原始程式碼做為參考
非常謝謝您!
WILDOX寫道…
RE: Bt
已經寄給您
Ronald寫道…
您好,
近期我也在開發電子發票相關的程式,
目前在排版與資料統整相關的地方遇到一些瓶頸。
若允許的話是否能參考您的原始程式碼呢?
已填寫上方提供的google表單了。
Email: jacky7770123@gmail.com
再次感謝您的研究與無私!
WILDOX寫道…
RE: Ronald
已經寄給您了

這個網誌中的熱門文章

【研究】列印的條碼為什麼很難刷(掃描)

C# 使用 Process.Start 執行外部程式