none
關於列印方式之請教 RRS feed

  • 問題

  •  
    請教各位前輩~

    我自己想做一個 類似 Word 中的「標籤列印」的程式,不過現在的問題是,當 User 輸入完後,該資料也可以取得了,但是要如何設定每個標籤間的距離給 printDocument 去做處理?

    希望列印出來的結果如圖 ( http://picasaweb.google.com.tw/codepaper/qKGPn#5307026212611494754 ) 中的 A & B ,假設分別各為2公分的空間距離~~~

    是否能請前輩給我點提示,讓我有個頭知道怎麼去進行,謝謝。

    ps. 現在是卡在不知道要如何去排版,讓印表示印出自己如圖的結果....

    一心只想學好程設~~~朝著目標前進
    2009年2月26日 上午 09:01

解答

  • 1. 的部分不就是列印?不管是前景或背景?OS 轉印就是一個 Print Job 。如果說中文容易搞混,英文的話應該會明確的使用 Print 而不會用 Convert ,這樣翻譯成中文就是列印,而非是轉或是轉印這種容易搞混的用詞。

    2. XML 的確是標準,但問題 XPS 不是。XPS 是微軟自訂的東西,所以前面舉例的是用微軟自己搞的東西來說明。再舉一個例子吧,在 WPF 前微軟主推 VML ,在 2004 我曾經向 CSS 提了兩個 VML 的 bug 問題,美國那邊的回應是 VML 不再更新,所以不改。之後在 2004/6 左右, WPF 還在開發階段,還沒訂明,我也有提建議,建議支援 OpenGIS 的 GML (GML / VML / WMF 所用的格式都是 XML ,都是從 SVG 精簡出來) ,當時開發部門的回應是未來會支援,但是目前 WPF 是以裝置環境為主,如果跟 GML 相容的話,可能會有很大的改版問題,VB2005/2008 也有不少與舊版不相容的地方,向 CSS 反映後,最後美國產品部門回應未來版本不支援的情形也大概有十來個,到 Connect 網站搜尋搞不好更多,從既有的歷史就可以知道,微軟自己也做過很多不再相容支援的事情來,當然你可以選擇相信微軟,但是否有必要先透過 XPS 再列印?還是直接列印?我只能說個人有各人的選擇,這種選擇是取捨問題,就像你覺得這麼做好,我覺得這麼做不好,你有你的理由,我有我的看法。
    再舉一個例子,.Net 1.x 中是用 System.Web.Mail 發信,到了 .Net 2.0 以後被廢了,改用 System.Net.Mail 發信,我想也沒人敢保證 .Net 3.0 中 System.Windows.Xps 這個類別能長長久久吧~

    3. 我在原先的 3 中一直寫 WMF / EMF ,那是向量檔,向量檔不會有鋸齒狀的問題,只是會依照參照解析度而有解析度是否夠密。所以 EMF+ 才支援實數座標來盡量使用到最大解析度。以向量方式列印,本身不會有鋸齒狀問題,而解析度問題是針對精準列印而言。標準 Fax 是 150 或 200 DPI ,現在市面上的雷射印表機大概是 1200 DPI ,噴墨印表機則更高,假設從紙張邊界開始數,要在 (50mm, 50mm) 列印 5 mm 高的文字,在 200 DPI 下,會印在 (50.038 mm, 50.038 mm) 高 4.953 mm ,在 1200 DPI 下,則會印在 (49.996 mm, 49.996 mm) 高 4.996 mm ,300 DPI 則印在 (49.953 mm, 49.953 mm) 高 4.995 mm ,因此,DPI 主要反應在精準列印上,當然解析度差看起來內容會有鋸齒狀,看傳統傳真跟印表機列印的結果就可以看出結果的差異。此外參照印表機解析度是不用改向量檔,直接繪圖即可,因為那本身就已經針對裝置有最佳的結果。若是透過既定的東西轉換,就可能增加了額外的限制而不自知。套表或標籤紙時,重點是精準列印,而非自動換行,自動換行並非難事,以前控制項沒這麼方便時,都能輕鬆做到了,自動換行根本就不是重點。
    再舉個例子,假設你在 WPF 只用了整數座標來畫圖,長寬圖面範圍為 0 ~ 1000 ,則對應到 A4 的解析度為 120.95 DPI x 85.52 DPI ,而 1000 x 1000 在螢幕上可能剛剛好,但在印表機上則遠遠不足,當然印出來還是點是點、線是線,但在紙上則會有上下左右的進位偏移。
    註:XPS 最大解析度經查線上手冊確認為 600 DPI 而非先前憑印象寫的 300 DPI ,300 DPI 為 Microsoft Office Document Image Writer 最大值,Acrobat 預設值。

    4. 這部分就通論來說,很正確,就針對用途的應用來說,我想這是個人見解,你可以覺得 XPS 最讚,我可以覺得直接用 Graphics 在 Printer 上較優,論證過程各自引用資料,最後我認為這種討論不會有結果的,就像程式語言討論區每年都會來幾次哪種語言最好的辯論,最後都是沒有結論,自己爽最重要。
    2009年3月1日 上午 06:36
  • 1.菜,沒關係,最重要的是心態問題.菜好現象,最怕的是人很菜,心態卻很老,大家都是過來人.
    2.我不是學者,作者,所以語言可能不是表現得很好.
    3.我寫的文章是上述所有討論所寫得一些~算感想吧!,不是針對任何人.
    4.你把WPF 的17章看完後,應該可以將螢幕的資料送至印表機.至於Sample Code,上 MSDN,只是大部分是英文,而Sample Code 都是片段,要玩出來一個企業產品,需要自己慢慢去拼去整合.
    5.企業不斷的變,技術不斷的創新,沒有所謂的正不正確的問題.像我都是在工作不斷的讀,但很多東西是看過,沒用過.有的東西是看了後用猜的.但每次使用者有新需求時,你就可以很快的照你已知道的知識,很快找出很多方案,找一可比較可行的方式去做.(很多企業不會給你太多時間,空間去考慮,通常問你都只有幾分鐘你就要說出一些也許,大概,可能是都東西給老闆).
    2009年3月2日 上午 12:40
  • .Net 的程式是用畫的,你可以直接在 PrintDocument_PrintPage 這邊變更 e.Graphics.PageUnit 為 Millimeter (公厘)
    你就很好定位了

    不過你還要考慮到印表機出血,此外實際上是用 1/100 英吋,所以換算後會稍微有變位,所有的位置請從頁首往下算,不要用相對位置,使用絕對位置。

    2009年2月26日 上午 09:28
  • 關於 HasMorePages 可以搜尋既有討論來看:
    http://www.google.com.tw/search?hl=zh-TW&q=HasMorePages+site%3Asocial.msdn.microsoft.com%2FForums%2Fzh-TW%2F&meta=&aq=f&oq=

    那個誤差沒辦法調整,所以前面才說不要用相對位置,用絕對位置,避免誤差累積。

    關於 PageUnit 直接看線上手冊就好,屬性、方法的說明一切以線上手冊說明為準,看線上手冊就有範例展示如何用,是否是直接寫 GraphicsUnit 是看你命名空間繼承的情況。

    2009年2月26日 上午 10:51
  •  不建議你用這種方式列印.

    因為企業通常都會有很多報表,很多印表機,很多種紙張,很多種格式,很多媒體,很多種發行樣式...去組成要的東西.

    如果你用這種方式去Layout輸出,你一天能做幾張?我看沒做出來就被老闆幹交.

    .net 裡有很多方式,協定去做這個,如果是我我可能考慮用XPS去做.一個人去設計輸出的Style,程式設計師只要將資料插到相對應的Tag裡就能做正確的輸出.

    2009年2月27日 上午 02:36
  • XPS 是MS 推出的可攜行文件,他的用意跟PDF差不多,但推的好不好就?

    因為我學的都是MS,為了省麻煩就用XPS,不用再去學PDF或買PDF的函式庫..

    XPS 的列印方式,就跟一幫的Word文件一樣,直接往印表機送就好了(目前Vist可以,XP的印表機驅動程式沒測),當然也可以直接在網頁上(IE6以上,其他沒測)看.

    X是XML的縮寫,這是非常重要的語言(我認為一個合格的程設師,需會一種程序語言,C#,VBx,Cx,Jx...,一種資料語言Sql,xx..,再來就是XML).目前X已經有很延伸規範了.

    X語言對於宣告很有用,像畫面宣告,流程宣告...而你只要知道X的定義,你就很容易去操作X語言,很容易去找出某結點,修改某內容,轉換某樣式了.

     

    2009年2月27日 上午 05:57
  • XPS 是伴隨 IE7 附贈的虛擬印表機 (Microsoft XPS Document Writer) 產生文件的附檔名。

    Win2k/XP/2003 可藉由安裝 IE7 取得。

    產出的檔案格式是一群 xml 格式、定義的檔案,最後用 zip 封裝成單一檔案,例如 Office 2007 的標準格式也是如此。 (docx, xlsx, pptx) ,在微軟網站可單獨下載 SDK 來聊解各段落的說明。

    我想好說的意思應該是先用 word 畫出你要的東西,然後用此虛擬印表機列印成 樣本.xps ,用 zip 工具解壓縮尋找關鍵字的位置後,用替換的方式來製造新的檔案,最後壓縮成為新的 xxx.xps ,再找印表機列印。

    我自己的看法這樣是繞大圈,而且 xps 解析度最高只有 300 DPI ,現在印表機隨便找解析度都在 600 DPI 以上,到時候套用到印表機印出報表,還是有移位的機率,此外虛擬印表機沒有出血,所以配合硬體出血要自己先算好,比如說事先就保留上下左右 2cm ,一般印表機出血都小於此值,不太會出槌,此外這種方法不適合圖形。

    當然,也可以用前面的直接在 PrintDocument 的方法列印到這個虛擬印表機,不過既然能用 PrintDocument 直接列印了,就乾脆印到真實印表機即可,我自己是測是列印成果時,才會用這個虛擬印表機,或是 Office 送的那個 Microsoft Office Document Image Writer 或 Acrobat,等到 OK 後才會往實體印表機送,開發時如何選擇看個人吧。

    新版的 Acrobat 在 PDF 支援自訂解析度,我自己曾經涉過 1200 DPI (很多雷射印表機已經是這個規格了) ,當然這些屬於進階討論,玩到後面才會管這些細節。

    2009年2月27日 上午 07:48
  • 1.XPS 是伴隨 IE7 附贈的虛擬印表機 (Microsoft XPS Document Writer) 產生文件的附檔名,這個??不能說錯.正確的說法是這個印表機,可以將原來要印到實體印表機的檔案轉印成xps檔,而不用直接列印.但反過來說你將XPS送至實體印表機是可以直接列印的.

    2.他是一群XML沒錯,所有Office 或其他的輸出格式包含PDF,Word都一樣,到最後都要轉成印表機看得懂於言,而XPS在Vista下都可以轉成印表機語言.

    它可以是Zip檔,也可以不是,他做Zip檔在於利於發行用.

    3.用Word畫出你要的東西,然後轉成xps再列印,這???方法之一.不只是Word可以轉,連其他office 檔案都可以轉.但~~不是我的意思,因為這樣不易跟資料庫做整合,我的14是將資料庫資料抓出,用程式Layout出xps檔直接送到印表機列印.

    4.300DPI,這沒研究過,但我試過很多格式列印PDF,Word...XPS印出來是相當精準跟漂亮的,至於邊界問題,當然取大一點,因為每台印表機特性不同.比較好的可能可以印到無邊界,但~誰知道程式部屬後會裝哪一台鳥印表機?

    2009年2月27日 上午 08:15
  • 你先把這個範例抓回去看,裡面有中文註解:
    http://msdn2.microsoft.com/zh-tw/library/54z247f9(VS.80).aspx

    主要程式碼雖然是 VB 的,不過反正都是 call .Net framework ,差別不大:

        ''' <summary>  
        ''' PrintPage 是列印事件。此事件會針對要列印的每一頁引發。  
        ''' 您也可以處理 BeginPrint 和 EndPrint 事件  
        ''' 以便進一步控制。  
        '''   
        ''' 下列程式碼對於純文字 (如 MeasureString) 計算  
        ''' 可納入整頁的文字來說,十分迅速而實用。  
        ''' 不過,對於格式化文字來說,就不是那麼實用。  
        ''' 在上述情況下,您會希望擁有較為複雜的文字層次   
        ''' (相對於頁面層次) 控制。  
        ''' </summary>  
        Private Sub pdoc_PrintPage(ByVal sender As ObjectByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage  
            ' 宣告變數,使其保存最後列印字元的位置。宣告為靜態,  
            ' 接下來的 PrintPage 事件就可以參考它。  
            Static intCurrentChar As Int32  
            ' 初始化要用於列印的字型。  
            Dim font As New Font("Microsoft Sans Serif", 24)  
     
            Dim intPrintAreaHeight, intPrintAreaWidth, marginLeft, marginTop As Int32  
            With PrintDocument1.DefaultPageSettings  
                ' 初始化包含列印區域矩形界限的  
                ' 區域變數。  
                intPrintAreaHeight = .PaperSize.Height - .Margins.Top - .Margins.Bottom  
                intPrintAreaWidth = .PaperSize.Width - .Margins.Left - .Margins.Right  
     
                ' 初始化區域變數,以保存將做為  
                ' 列印區域矩形左上角的   
                ' X 和 Y 座標的邊界值。  
                marginLeft = .Margins.Left ' X 座標  
                marginTop = .Margins.Top ' Y 座標  
            End With 
     
            ' 如果使用者選取 Landscape 模式,則會交換列印區域的  
            ' 高度和寬度。  
            If PrintDocument1.DefaultPageSettings.Landscape Then 
                Dim intTemp As Int32  
                intTemp = intPrintAreaHeight  
                intPrintAreaHeight = intPrintAreaWidth  
                intPrintAreaWidth = intTemp  
            End If 
     
            ' 根據列印區域的高度和字型高度計算  
            ' 文件的總行數。  
            Dim intLineCount As Int32 = CInt(intPrintAreaHeight / font.Height)  
            ' 初始化會定義列印區域的矩形結構。  
            Dim rectPrintingArea As New RectangleF(marginLeft, marginTop, intPrintAreaWidth, intPrintAreaHeight)  
     
            ' 執行個體化 StringFormat 類別,其會封裝文字配置資訊   
            ' (例如對齊和行距)、顯示管理項目 (例如插入省略符號和國家   
            ' (地區) 數字取代),以及 OpenType 功能。  
            ' 使用 StringFormat 會造成 MeasureString 和 DrawString 在  
            ' 列印各頁時只使用整數行,而在各頁的每頁行數  
            ' 無法整除時 (此為常見的情況),略過可能要列印的  
            ' 部分行。  
            ' 請參閱 SDK 文件中有關 StringFormatFlags 的進一步討論。  
            Dim fmt As New StringFormat(StringFormatFlags.LineLimit)  
            ' 呼叫 MeasureString 以決定將納入列印區域矩形中的  
            ' 字元數。CharFitted Int32 會傳遞 ByRef,並於之後  
            ' 計算 intCurrentChar 及 HasMorePages 時使用。  
            ' 此範例不需要 LinesFilled,但必須在傳遞 CharsFitted 時  
            ' 一併傳遞。Mid 用於傳遞前一個列印頁面留下的剩餘  
            ' 文字區段 (提醒您,intCurrentChar 宣告為  
            ' 靜態)。  
            Dim intLinesFilled, intCharsFitted As Int32  
            e.Graphics.MeasureString(Mid(txtDocument.Text, intCurrentChar + 1), font, _  
                        New SizeF(intPrintAreaWidth, intPrintAreaHeight), fmt, _  
                        intCharsFitted, intLinesFilled)  
     
            ' 將文字列印至頁面。  
            e.Graphics.DrawString(Mid(txtDocument.Text, intCurrentChar + 1), font, _  
                Brushes.Black, rectPrintingArea, fmt)  
     
            ' 將目前字元接上此頁面最後列印的字元。由於  
            ' intCurrentChar 是靜態變數,因此其值可用於要  
            ' 列印的下一頁。其進展單位為 1 並傳遞至 Mid(),  
            ' 以便列印下一頁 (請參閱前文的 MeasureString())。  
            intCurrentChar += intCharsFitted  
     
            ' HasMorePages 會通知列印模組是否應引發另一個    
            ' PrintPage 事件。  
            If intCurrentChar < txtDocument.Text.Length Then 
                e.HasMorePages = True 
            Else 
                e.HasMorePages = False 
                ' 您必須明確重設 intCurrentChar,因為它是靜態的。  
                intCurrentChar = 0  
            End If 
        End Sub 


    另外,給好說
    1. 如果你先前說的是 System.Windows.Xps 這個類別,恕我孤陋寡聞,我先前在 IE7 出來就直接看 XPS SDK ,所以我會覺得實作上滿困難的,但是剛剛稍微翻了一下這個類別,已經有很多部分由 .Net 3.0 包起來了,快了很多。至於從 XPS 印出來是由 OS 下去轉?看不懂,如果你的意思是再列印或背景列印,那跟我原先說的意思一樣。


    2. 的部分... 在 XPS 之前,微軟是推 Microsoft Office Document Image Writer / Microsoft Office Live Meeting 2007 Document Writer 的 MDI ,SDK 也還活著好好的,現在變成 XPS ... 原先繪圖元件是推比爾在 2000 年主打的 DNA(OWC) ,到了 Office 2007 把 OWC 廢掉,到了 2008 推出 MSChart 3.5 ,繼承當初 VB6 的 MSChart 2.0 的產品名,卻沒有一致性...

    3. 不知道有沒有需求是在網頁列印時要輸出高解析度的圖檔,而不要會有鋸齒狀或模糊的現象?網頁複雜度比較高,瀏覽器預設不支援,要繞路走。瀏覽器還可以裝傻當成限制,但是本機的 Windows 程式,就不能避免印表機解析度問題。
    至於 DPI 部分,從 Windows 1.0 就一直有這部分的需求,在 Office 4.2 年代,為配合印表機需要,在 Windows 3.1 內建的 WMF 加上 22 bytes 檔頭,俗稱 WMF(P),到了 Windows 9x/NT 時,改用 EMF 就是要適應印表機需求跟大圖輸出 (例如我用過 A0 Size 的繪圖機) ,而到了 GDI+ 原先的 4 bytes 整數座標已不敷使用,最好能提高到 8 bytes 座標系統,但為了與過去的 EMF 相容,推出 EMF+ 4 bytes 實數座標來當作暫訂方案。Office 2003 以前,只有 Word / Visio 是參照印表機解析度,Excel / PowerPoint 是參照螢幕解析度,隨著高解析度的需求,到了 Office 2007 ,Excel / PowerPoint 也改參照印表機解析度,更增加這個問題的複雜度。即將推出的 Windows 7 / Win2008 R2 ,終於在螢幕上也注意到這個問題,以前螢幕字型只有 96/125 DPI ,在 Windows 7 新增 150 DPI ,相對產生一堆問題,會影響到程式設計,微軟已經發布一些程式碼修改的片段範例,來協助開發者支援。
    這種東西是與時俱進,DPI 跟顯示裝置有直接關係,印表機進步比較明顯,造成的改變也明顯,螢幕則是近幾年 LCD 大螢幕或電視快速平民化,間接需求刺激到作業系統改版,從 Win3.x 以來,針對螢幕解析度的改版還是第一次。Microsoft Press 有專書討論,其他的則分散在 MSDN 內各部份,過去如果只管螢幕輸出,不管其他輸出裝置的話,包含網頁,基本上不太需要管到這個,因為從 1988 以來,這 20 年也才即將要在 Windows 7 改版,所以過去不用考慮是滿正常的。

    2009年2月28日 上午 06:26
  • 1.所謂OS轉印的意思就是,當你有一支新應用程式協定,比如說PDF,Word,網頁,Image....你送至印表機列印,為什麼你能直接印出,而不用自己寫印表機的一些控制?那就是OS(作業系統)將這些協定轉成印表機看得懂的語言.當然這是依些已知的舊協定.而就新的協定,就要裝新的轉換程式,比如.NET Framework....而印表機公司也要寫一支OS認定的驅動程式,所以.........一些協定匹配後,你只要關心你的Layout跟領域需求,其他的他做自己做.
    2.一個協定好不好,支援長不長久,你要看這個協定是標準協定還是自己本身(MS)協定,所謂標準協定是經國際標準組織認定,而不是特定公司內部協定,只要經標準協定後,其他的公司就能互通.當然會有新的,更好的協定出來,看你要不要用新的,但舊的還是可以用不會被廢除.
    3.你的做法當然會有鋸齒問題.像我用WPF或一些新寫法,他有二種文件,一種固定文件,一種流動文件.固定文件像PDF,XPS...我設字型15它就是15,不管你在Desktop,NB,PDA,印表機....,也不用管解析度如何,寬窄螢幕,還是S$喜歡出跟人家不同的怪怪螢幕,他出來就是15,它內部會自己計算自己的點數去符合這大小,所以不會產生鋸齒.流動文件,就是他自己會算邊界,比如你要顯示一段文章約2000字,你在寬螢幕它可能顯示2行,你在窄螢幕,他就變成三行,你用PDA去看他就變成十幾行,這些也都內部自己算.你不用去寫那麼多的繪圖公式去算這個.

    4.寫程式方式百百種,我只能點一下,我不能教你做,像我用WPF它的函式就有這些功能,但你寫的是Windows Form,我不能說錯,不能說爛,也不能叫你用WPF重寫.XPS我只能說我可能優先選用,當我不認為這是最重要的,我認為X才最重要,你要寫XPS你要知道XML你才有辦法去完全控制XPS,但懂X可能要花很久的時間.
    我在討論區發言,都是以長久的考量為主,不是這裡痛治這裡,那裡痛就那裡.因為一般的程設師想的都是程式就是if else...我覺得這樣很容易掛掉,可能寫一二年就寫不下去了或者程式超過幾萬行就無法突破的困境.
    但要看的一些先進的作法,可能要花很多的時間跟很多的文章才有辦法在幾行Code就解出,不然就算給Simpe Code 你不知道意義都沒用.






    2009年2月28日 下午 02:22

所有回覆

  • .Net 的程式是用畫的,你可以直接在 PrintDocument_PrintPage 這邊變更 e.Graphics.PageUnit 為 Millimeter (公厘)
    你就很好定位了

    不過你還要考慮到印表機出血,此外實際上是用 1/100 英吋,所以換算後會稍微有變位,所有的位置請從頁首往下算,不要用相對位置,使用絕對位置。

    2009年2月26日 上午 09:28
  • 謝謝大大你的指點....我會去試試您說的方法

    但想再請問您
    您所提到的 「 .... 實際上是用 1/100 英吋,所以換算後會稍微有變位 ...」
    這意思是  英吋  跟  之前所說的  公厘 自己要去計算那誤差值並調整....請問是這樣的意思嗎?

    大大您說的改變 e.Graphics.PageUnit 為 Millmeter ,我剛再去 google 了一下,想跟您確認是下面這樣子寫嗎?
    1 e.Graphics.PageUnit=GraphicsUnit.Millimeter 

    ==========================

    額外延伸地再請教各位前輩....

    如果說....一頁列印不夠,會印到第二頁或更多,
    那麼.....  也是利用計算紙張大小 然後再跟輸出的資料比對,
    最後把多的印到第二頁之後,請問是這樣嗎?

    那這樣還是否會用到 e.HasMorePages 來自動判斷呢?
    一心只想學好程設~~~朝著目標前進
    2009年2月26日 上午 10:14
  • 關於 HasMorePages 可以搜尋既有討論來看:
    http://www.google.com.tw/search?hl=zh-TW&q=HasMorePages+site%3Asocial.msdn.microsoft.com%2FForums%2Fzh-TW%2F&meta=&aq=f&oq=

    那個誤差沒辦法調整,所以前面才說不要用相對位置,用絕對位置,避免誤差累積。

    關於 PageUnit 直接看線上手冊就好,屬性、方法的說明一切以線上手冊說明為準,看線上手冊就有範例展示如何用,是否是直接寫 GraphicsUnit 是看你命名空間繼承的情況。

    2009年2月26日 上午 10:51
  • 謝謝  心冷熱情熄前輩的指導....  感謝您....

    那就先這樣子....  我就先去實作看看,如有再有問題再來請教您~~  謝謝。
    一心只想學好程設~~~朝著目標前進
    2009年2月26日 上午 11:37
  •  不建議你用這種方式列印.

    因為企業通常都會有很多報表,很多印表機,很多種紙張,很多種格式,很多媒體,很多種發行樣式...去組成要的東西.

    如果你用這種方式去Layout輸出,你一天能做幾張?我看沒做出來就被老闆幹交.

    .net 裡有很多方式,協定去做這個,如果是我我可能考慮用XPS去做.一個人去設計輸出的Style,程式設計師只要將資料插到相對應的Tag裡就能做正確的輸出.

    2009年2月27日 上午 02:36
  • 好說大大~~

    首先很感謝你的回覆。 

    但我對列印這塊不是很熟悉,可以說是沒有頭緒該怎麼下手去做,因此也很感謝您及心冷熱情熜大大給我的方向指導。真的很謝謝你們。

    而您說的方式用 XPS ,不知道這是怎樣一個運行方式呢?  要如何去 code 那程式碼?  是否能請您再給我多點方向,讓我好去survey資料....

    還是您是否可以請您提供範例檔讓我學習。謝謝。

    最後,再請您給予費心指導呢?  謝謝。

    ps. 我這是想用來列印 " 標籤 "  所以那列印的位置會有所固定....例如:一頁列印10個標籤 ( 左5個 右5個 ) 像這樣一個列印方式,也適合用 xps 嗎?


    一心只想學好程設~~~朝著目標前進
    2009年2月27日 上午 03:00
  • XPS 是MS 推出的可攜行文件,他的用意跟PDF差不多,但推的好不好就?

    因為我學的都是MS,為了省麻煩就用XPS,不用再去學PDF或買PDF的函式庫..

    XPS 的列印方式,就跟一幫的Word文件一樣,直接往印表機送就好了(目前Vist可以,XP的印表機驅動程式沒測),當然也可以直接在網頁上(IE6以上,其他沒測)看.

    X是XML的縮寫,這是非常重要的語言(我認為一個合格的程設師,需會一種程序語言,C#,VBx,Cx,Jx...,一種資料語言Sql,xx..,再來就是XML).目前X已經有很延伸規範了.

    X語言對於宣告很有用,像畫面宣告,流程宣告...而你只要知道X的定義,你就很容易去操作X語言,很容易去找出某結點,修改某內容,轉換某樣式了.

     

    2009年2月27日 上午 05:57
  • XPS 是伴隨 IE7 附贈的虛擬印表機 (Microsoft XPS Document Writer) 產生文件的附檔名。

    Win2k/XP/2003 可藉由安裝 IE7 取得。

    產出的檔案格式是一群 xml 格式、定義的檔案,最後用 zip 封裝成單一檔案,例如 Office 2007 的標準格式也是如此。 (docx, xlsx, pptx) ,在微軟網站可單獨下載 SDK 來聊解各段落的說明。

    我想好說的意思應該是先用 word 畫出你要的東西,然後用此虛擬印表機列印成 樣本.xps ,用 zip 工具解壓縮尋找關鍵字的位置後,用替換的方式來製造新的檔案,最後壓縮成為新的 xxx.xps ,再找印表機列印。

    我自己的看法這樣是繞大圈,而且 xps 解析度最高只有 300 DPI ,現在印表機隨便找解析度都在 600 DPI 以上,到時候套用到印表機印出報表,還是有移位的機率,此外虛擬印表機沒有出血,所以配合硬體出血要自己先算好,比如說事先就保留上下左右 2cm ,一般印表機出血都小於此值,不太會出槌,此外這種方法不適合圖形。

    當然,也可以用前面的直接在 PrintDocument 的方法列印到這個虛擬印表機,不過既然能用 PrintDocument 直接列印了,就乾脆印到真實印表機即可,我自己是測是列印成果時,才會用這個虛擬印表機,或是 Office 送的那個 Microsoft Office Document Image Writer 或 Acrobat,等到 OK 後才會往實體印表機送,開發時如何選擇看個人吧。

    新版的 Acrobat 在 PDF 支援自訂解析度,我自己曾經涉過 1200 DPI (很多雷射印表機已經是這個規格了) ,當然這些屬於進階討論,玩到後面才會管這些細節。

    2009年2月27日 上午 07:48
  • 1.XPS 是伴隨 IE7 附贈的虛擬印表機 (Microsoft XPS Document Writer) 產生文件的附檔名,這個??不能說錯.正確的說法是這個印表機,可以將原來要印到實體印表機的檔案轉印成xps檔,而不用直接列印.但反過來說你將XPS送至實體印表機是可以直接列印的.

    2.他是一群XML沒錯,所有Office 或其他的輸出格式包含PDF,Word都一樣,到最後都要轉成印表機看得懂於言,而XPS在Vista下都可以轉成印表機語言.

    它可以是Zip檔,也可以不是,他做Zip檔在於利於發行用.

    3.用Word畫出你要的東西,然後轉成xps再列印,這???方法之一.不只是Word可以轉,連其他office 檔案都可以轉.但~~不是我的意思,因為這樣不易跟資料庫做整合,我的14是將資料庫資料抓出,用程式Layout出xps檔直接送到印表機列印.

    4.300DPI,這沒研究過,但我試過很多格式列印PDF,Word...XPS印出來是相當精準跟漂亮的,至於邊界問題,當然取大一點,因為每台印表機特性不同.比較好的可能可以印到無邊界,但~誰知道程式部屬後會裝哪一台鳥印表機?

    2009年2月27日 上午 08:15
  • 心冷熱情熄前輩.... 

    你好專業喔~~~連那些 DPI 等因素都考量進去了....  真的是「先角 (台語) (即:  專家的意思 ) 」...

    那依您的建議還是用之前您所說的那樣子來做會對於「定位」要求較嚴格的人來說會比較能得到較滿意的結果....請問您是這樣的意思嗎???

     

    不好意思.....  再請您費心.....  感謝  心冷熱情熄 前輩....

     

    PS. 心冷熱情熄前輩....  我對於 PrintDocument 有去看一些資料

    請問看這幾篇 

    1. 學習.Net(c#)打印--打印預覽   -->   http://www.cnblogs.com/scottckt/archive/2009/02/10/1059576.html  


    2. HOW TO:使用預覽列印在 Windows Form 中進行列印  --->  http://msdn.microsoft.com/zh-tw/library/ms404294.aspx

    3. 紙張大小設定,列印單位,原點座標的列印相關問題  ---> http://www.programmer-club.com/pc2020v5/forum/ShowSameTitleN.asp?URL=N&board_pc2020=vbdotnet&id=10625

    4. 如何讓 Word 使用 Microsoft Visual C# .NET 自動建立一個合併列印的文件。  -->   http://support.microsoft.com/kb/301659/zh-tw

    5. PrintDocument 類別  ---->  http://msdn.microsoft.com/zh-tw/library/system.drawing.printing.printdocument(VS.80).aspx

    是否足夠解決我這樣的問題呢?

     

    您是否可以建議我還可以看哪些文章?  再請您指導,謝謝。


    一心只想學好程設~~~朝著目標前進

    2009年2月27日 上午 10:00
  • 好說 前輩....

    如果說是我想要做一個  自製的  標籤系統  像這樣的 AP, 那麼你所指的XPS 是不是如我圖 ( http://picasaweb.google.com.tw/codepaper/qKGPn#5307026212611494754 ) 這個內容一樣? 

    也就是先做一個樣版的概念,然後再把 公司 User 所輸入的資料填入那每個標籤之中,然後再送給「任何一個 printer」,請問我這樣說法不知道有沒有誤會您的意思呢???

     

    好說前輩....  再請您給予指導~~  謝謝您。

     

    ps. 我有去 survey 一些關於 XPS 的資料

    以這篇為首 : http://msdn.microsoft.com/zh-tw/library/aa969772.aspx 

    其他延伸的: 
    http://msdn.microsoft.com/zh-tw/library/ms742418.aspx
    http://msdn.microsoft.com/zh-tw/library/ms771525.aspx
    http://msdn.microsoft.com/zh-tw/library/aa970848.aspx

    不知道我這個方向對嗎?  是否還有哪些您可以建議我去看的文章嗎?   再請您指導,謝謝。


    一心只想學好程設~~~朝著目標前進
    2009年2月27日 上午 10:07
  • 1, 2 說的怪怪的。各家印表機有自己的印表機語言,特別是雷射印表機,XPS 不能直接轉成印表機語言,但是可以重新列印到各印表機。

    3. 的部分要是完全自己出 xps 檔,而不是透過樣本檔去... 光是看懂 SDK 正確出檔包含 Zip 要不要三個月啊?我覺得這樣是繞遠路,而且不是通解,哪天微軟又出新東西把 XPS 廢掉或是改版的話,那不是白做工嗎?標準直接用 e.Graphics 畫,至少從 .Net 2002 到現在,都沒變過,而且就算變,退回 API 的話,也可以換算。

    XPS 的官方進入位置:http://www.microsoft.com/whdc/xps/default.mspx

    至於 PrintDocument 的用法,在使用前最好有 PictureBox 的繪圖經驗,有經驗以後,跟印表機是一樣的,兩個只差在解析度上,PictureBox 是參照螢幕解析度,一般來說在 72 ~ 96 DPI 間,當然螢幕比較適合用 Pixel 而不適合用公厘或英吋為單位了。

    2009年2月27日 下午 01:10
  • 心冷熱情熄前輩....真的很謝謝你.....

    因為我之前都比較少在碰 繪圖這塊的領域,所以現在才開始著手,真的很多地方都很不了解,而了解的部份大都是所謂的「常識」,好像難以成大器,更別說能做好..........

    那依您的看法, e.Graphics 這樣一個繪圖方式,是否能從怎樣子著手,可否請您給我多點提示,我再自己去 survey.....然後再請您給我指導好嗎?  謝謝您。

     

     


    一心只想學好程設~~~朝著目標前進
    2009年2月27日 下午 01:16
  • to 心冷熱情熄 

    1.科技在進步,XPS不是直接轉成印表機語言,而是OS下去轉的.

    2.我覺得東西一直在進步,可能改版,可能廢除,但概念是一層一層的上去,學X以後學新的規範比較快.像我以前寫ASP.NET 到現在WPF都是相通的.

    3.我寫8年程式,我都沒算過DPI,不管寫ASP.NET OR WPF,根本不用考慮這些問題跟畫面刷新的問題,牠就乖乖的到我要的畫面.

    我覺得現在環境比以前複雜多了,NB的規格那麼多,螢幕有大有小,有寬有窄,解析度也不同,怎麼去算這些東西?

     

    2009年2月27日 下午 02:41
  • 你先把這個範例抓回去看,裡面有中文註解:
    http://msdn2.microsoft.com/zh-tw/library/54z247f9(VS.80).aspx

    主要程式碼雖然是 VB 的,不過反正都是 call .Net framework ,差別不大:

        ''' <summary>  
        ''' PrintPage 是列印事件。此事件會針對要列印的每一頁引發。  
        ''' 您也可以處理 BeginPrint 和 EndPrint 事件  
        ''' 以便進一步控制。  
        '''   
        ''' 下列程式碼對於純文字 (如 MeasureString) 計算  
        ''' 可納入整頁的文字來說,十分迅速而實用。  
        ''' 不過,對於格式化文字來說,就不是那麼實用。  
        ''' 在上述情況下,您會希望擁有較為複雜的文字層次   
        ''' (相對於頁面層次) 控制。  
        ''' </summary>  
        Private Sub pdoc_PrintPage(ByVal sender As ObjectByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage  
            ' 宣告變數,使其保存最後列印字元的位置。宣告為靜態,  
            ' 接下來的 PrintPage 事件就可以參考它。  
            Static intCurrentChar As Int32  
            ' 初始化要用於列印的字型。  
            Dim font As New Font("Microsoft Sans Serif", 24)  
     
            Dim intPrintAreaHeight, intPrintAreaWidth, marginLeft, marginTop As Int32  
            With PrintDocument1.DefaultPageSettings  
                ' 初始化包含列印區域矩形界限的  
                ' 區域變數。  
                intPrintAreaHeight = .PaperSize.Height - .Margins.Top - .Margins.Bottom  
                intPrintAreaWidth = .PaperSize.Width - .Margins.Left - .Margins.Right  
     
                ' 初始化區域變數,以保存將做為  
                ' 列印區域矩形左上角的   
                ' X 和 Y 座標的邊界值。  
                marginLeft = .Margins.Left ' X 座標  
                marginTop = .Margins.Top ' Y 座標  
            End With 
     
            ' 如果使用者選取 Landscape 模式,則會交換列印區域的  
            ' 高度和寬度。  
            If PrintDocument1.DefaultPageSettings.Landscape Then 
                Dim intTemp As Int32  
                intTemp = intPrintAreaHeight  
                intPrintAreaHeight = intPrintAreaWidth  
                intPrintAreaWidth = intTemp  
            End If 
     
            ' 根據列印區域的高度和字型高度計算  
            ' 文件的總行數。  
            Dim intLineCount As Int32 = CInt(intPrintAreaHeight / font.Height)  
            ' 初始化會定義列印區域的矩形結構。  
            Dim rectPrintingArea As New RectangleF(marginLeft, marginTop, intPrintAreaWidth, intPrintAreaHeight)  
     
            ' 執行個體化 StringFormat 類別,其會封裝文字配置資訊   
            ' (例如對齊和行距)、顯示管理項目 (例如插入省略符號和國家   
            ' (地區) 數字取代),以及 OpenType 功能。  
            ' 使用 StringFormat 會造成 MeasureString 和 DrawString 在  
            ' 列印各頁時只使用整數行,而在各頁的每頁行數  
            ' 無法整除時 (此為常見的情況),略過可能要列印的  
            ' 部分行。  
            ' 請參閱 SDK 文件中有關 StringFormatFlags 的進一步討論。  
            Dim fmt As New StringFormat(StringFormatFlags.LineLimit)  
            ' 呼叫 MeasureString 以決定將納入列印區域矩形中的  
            ' 字元數。CharFitted Int32 會傳遞 ByRef,並於之後  
            ' 計算 intCurrentChar 及 HasMorePages 時使用。  
            ' 此範例不需要 LinesFilled,但必須在傳遞 CharsFitted 時  
            ' 一併傳遞。Mid 用於傳遞前一個列印頁面留下的剩餘  
            ' 文字區段 (提醒您,intCurrentChar 宣告為  
            ' 靜態)。  
            Dim intLinesFilled, intCharsFitted As Int32  
            e.Graphics.MeasureString(Mid(txtDocument.Text, intCurrentChar + 1), font, _  
                        New SizeF(intPrintAreaWidth, intPrintAreaHeight), fmt, _  
                        intCharsFitted, intLinesFilled)  
     
            ' 將文字列印至頁面。  
            e.Graphics.DrawString(Mid(txtDocument.Text, intCurrentChar + 1), font, _  
                Brushes.Black, rectPrintingArea, fmt)  
     
            ' 將目前字元接上此頁面最後列印的字元。由於  
            ' intCurrentChar 是靜態變數,因此其值可用於要  
            ' 列印的下一頁。其進展單位為 1 並傳遞至 Mid(),  
            ' 以便列印下一頁 (請參閱前文的 MeasureString())。  
            intCurrentChar += intCharsFitted  
     
            ' HasMorePages 會通知列印模組是否應引發另一個    
            ' PrintPage 事件。  
            If intCurrentChar < txtDocument.Text.Length Then 
                e.HasMorePages = True 
            Else 
                e.HasMorePages = False 
                ' 您必須明確重設 intCurrentChar,因為它是靜態的。  
                intCurrentChar = 0  
            End If 
        End Sub 


    另外,給好說
    1. 如果你先前說的是 System.Windows.Xps 這個類別,恕我孤陋寡聞,我先前在 IE7 出來就直接看 XPS SDK ,所以我會覺得實作上滿困難的,但是剛剛稍微翻了一下這個類別,已經有很多部分由 .Net 3.0 包起來了,快了很多。至於從 XPS 印出來是由 OS 下去轉?看不懂,如果你的意思是再列印或背景列印,那跟我原先說的意思一樣。


    2. 的部分... 在 XPS 之前,微軟是推 Microsoft Office Document Image Writer / Microsoft Office Live Meeting 2007 Document Writer 的 MDI ,SDK 也還活著好好的,現在變成 XPS ... 原先繪圖元件是推比爾在 2000 年主打的 DNA(OWC) ,到了 Office 2007 把 OWC 廢掉,到了 2008 推出 MSChart 3.5 ,繼承當初 VB6 的 MSChart 2.0 的產品名,卻沒有一致性...

    3. 不知道有沒有需求是在網頁列印時要輸出高解析度的圖檔,而不要會有鋸齒狀或模糊的現象?網頁複雜度比較高,瀏覽器預設不支援,要繞路走。瀏覽器還可以裝傻當成限制,但是本機的 Windows 程式,就不能避免印表機解析度問題。
    至於 DPI 部分,從 Windows 1.0 就一直有這部分的需求,在 Office 4.2 年代,為配合印表機需要,在 Windows 3.1 內建的 WMF 加上 22 bytes 檔頭,俗稱 WMF(P),到了 Windows 9x/NT 時,改用 EMF 就是要適應印表機需求跟大圖輸出 (例如我用過 A0 Size 的繪圖機) ,而到了 GDI+ 原先的 4 bytes 整數座標已不敷使用,最好能提高到 8 bytes 座標系統,但為了與過去的 EMF 相容,推出 EMF+ 4 bytes 實數座標來當作暫訂方案。Office 2003 以前,只有 Word / Visio 是參照印表機解析度,Excel / PowerPoint 是參照螢幕解析度,隨著高解析度的需求,到了 Office 2007 ,Excel / PowerPoint 也改參照印表機解析度,更增加這個問題的複雜度。即將推出的 Windows 7 / Win2008 R2 ,終於在螢幕上也注意到這個問題,以前螢幕字型只有 96/125 DPI ,在 Windows 7 新增 150 DPI ,相對產生一堆問題,會影響到程式設計,微軟已經發布一些程式碼修改的片段範例,來協助開發者支援。
    這種東西是與時俱進,DPI 跟顯示裝置有直接關係,印表機進步比較明顯,造成的改變也明顯,螢幕則是近幾年 LCD 大螢幕或電視快速平民化,間接需求刺激到作業系統改版,從 Win3.x 以來,針對螢幕解析度的改版還是第一次。Microsoft Press 有專書討論,其他的則分散在 MSDN 內各部份,過去如果只管螢幕輸出,不管其他輸出裝置的話,包含網頁,基本上不太需要管到這個,因為從 1988 以來,這 20 年也才即將要在 Windows 7 改版,所以過去不用考慮是滿正常的。

    2009年2月28日 上午 06:26
  • 再次地謝謝心冷熱情熄前輩的指導....
    那範例我剛有先去抓下來,真的很謝謝您....

    ====================

    To 兩位前輩 :

    至今我真的很感謝兩位前輩的指導,也給我很大的方向,至少對於列印這方面完全不熟的我而言,真的讓我學習很多。
    真的很感謝兩位大大的教導。

    此外,我現在看到兩位大大這樣的一來一往的回答,當然也讓我受益良多,
    也讓我對列印這個領域有所初步的認識,讓我知道有什麼方法可以來解決及一些演進過程。

    這些相信很多程設的後生晚輩而言,真的是個很棒的學習資產。
    再此,還是要深深地感謝你們的用心。

    但,不知道是我體質比較過敏,還是我神經不夠大條,
    總感覺兩位大大如果為了我這點小事而不小心傷了和氣那就不好.....
    希望我的感覺是錯的才好......

    最後,真的很謝謝兩位前輩的指導.....真的真的很感謝........  

    *特別 P.S.

    心冷熱情熄前輩,您真的對列印這區塊好熟喔~~
    真不知道要學多久才能像您這樣地熟這個領域知識說....
    您很值得我學習.....


    好說前輩,您對XPS似乎有著獨到的看法及應用,
    對我這後生晚輩而言,也讓我多了一個設計層面可以去思考及應用。
    不知道您那是否也能指導我給我個簡易的 Sample 好讓我學習您所說方法呢?  



    最後,真的很誠摯地感謝兩位前輩給予的方向建議及指導,真的真的很謝謝你們。
    請兩位前輩接受我最真誠的謝忱....感恩

    一心只想學好程設~~~朝著目標前進
    2009年2月28日 下午 01:39
  • 1.所謂OS轉印的意思就是,當你有一支新應用程式協定,比如說PDF,Word,網頁,Image....你送至印表機列印,為什麼你能直接印出,而不用自己寫印表機的一些控制?那就是OS(作業系統)將這些協定轉成印表機看得懂的語言.當然這是依些已知的舊協定.而就新的協定,就要裝新的轉換程式,比如.NET Framework....而印表機公司也要寫一支OS認定的驅動程式,所以.........一些協定匹配後,你只要關心你的Layout跟領域需求,其他的他做自己做.
    2.一個協定好不好,支援長不長久,你要看這個協定是標準協定還是自己本身(MS)協定,所謂標準協定是經國際標準組織認定,而不是特定公司內部協定,只要經標準協定後,其他的公司就能互通.當然會有新的,更好的協定出來,看你要不要用新的,但舊的還是可以用不會被廢除.
    3.你的做法當然會有鋸齒問題.像我用WPF或一些新寫法,他有二種文件,一種固定文件,一種流動文件.固定文件像PDF,XPS...我設字型15它就是15,不管你在Desktop,NB,PDA,印表機....,也不用管解析度如何,寬窄螢幕,還是S$喜歡出跟人家不同的怪怪螢幕,他出來就是15,它內部會自己計算自己的點數去符合這大小,所以不會產生鋸齒.流動文件,就是他自己會算邊界,比如你要顯示一段文章約2000字,你在寬螢幕它可能顯示2行,你在窄螢幕,他就變成三行,你用PDA去看他就變成十幾行,這些也都內部自己算.你不用去寫那麼多的繪圖公式去算這個.

    4.寫程式方式百百種,我只能點一下,我不能教你做,像我用WPF它的函式就有這些功能,但你寫的是Windows Form,我不能說錯,不能說爛,也不能叫你用WPF重寫.XPS我只能說我可能優先選用,當我不認為這是最重要的,我認為X才最重要,你要寫XPS你要知道XML你才有辦法去完全控制XPS,但懂X可能要花很久的時間.
    我在討論區發言,都是以長久的考量為主,不是這裡痛治這裡,那裡痛就那裡.因為一般的程設師想的都是程式就是if else...我覺得這樣很容易掛掉,可能寫一二年就寫不下去了或者程式超過幾萬行就無法突破的困境.
    但要看的一些先進的作法,可能要花很多的時間跟很多的文章才有辦法在幾行Code就解出,不然就算給Simpe Code 你不知道意義都沒用.






    2009年2月28日 下午 02:22
  • 是的....  好說前輩~~
    你說的我有了解到您的意思....
    至於您提到的WPF 說實在,我也是剛有在碰一點,一定不像您所說的像您這樣的熟,這點是無甭置疑的,我也相信您所說的內容,您說的或許沒錯, 只會 if else 這樣的基本功...這大家都可能都會,人....總是要多學點新的東西,這點我也很認同,或許我的意思表達的不是這樣的清楚,可能讓您有所誤解啦~~~
    在這向您 say sorry!!!

    我指的 sample code 就正如心冷熱情熄大大的所提供一個所謂的「方向」,至少讓我有個了解,因為那個 sample code 我有去看了一下,裡面也有提的還蠻清楚的,而我現在想請您幫忙的是...........看您那是否有你覺得可以「推薦的文章」或更好點有個 Sample Code 好讓我學習、模仿,

    說真的,你說要弄清處XML 等先備知識,這點我非常認同,同時要向您報告的是,我並不是不重基礎的,我也知道必須要向您學習那求真求實的精神......因此,我只是想學習這方面 ( 列印... ) 這方面的技巧~~  所以才到這來向各位先進求藝,請大家給我這後生晚輩惠予指導。

    至於你說 WPF 的那部份,是否也能給我多點提示呢? 

    我有本  Applications = code + markup  , Microsoft Windows Presentation Foundation 程式設計指南 這本書,所以我對你提的新的技術都很愛去學習。

    俗話說的好.....師父領進門,修行在個人.....

    您跟心冷熱情熄大大都像我這方面的領域的師父,我都很想學習,
    我也知道:羅馬不是一天所造成的....

    因此,像這方面的東西我也是會不斷地學習,只是正如我開文所說的.......
    不怕您笑,講難聽一點的就是.........我很菜....菜味十足啦.....

    所以這方面我就只能多努力,看是否能儘快多學點這方面的技能,看看是否能有你們一點點的功力我就滿足了我小小的心靈....


    PS. 好說大大......想請問 XML .... 因為我之前有做過 GIS 這方面,裡面有些圖資及內容還有特定服務也有用過 XML 這類的格式 ( 他們是變成 KML 的樣子)所以不知道這樣是否有達到您的一個所謂要了解 XML 的先備概念呢?


    如果您覺得還可以的話,是否方便請您多給我些更進一步的提示,引導我呢?  謝謝.......

    ps. 剛提到的那本書的 Chapter 17 列印與對話盒......這章節我還沒詳讀.....  不知道這章節是否能解決我開文的那個問題..........




    一心只想學好程設~~~朝著目標前進
    2009年2月28日 下午 03:23
  • 1. 的部分不就是列印?不管是前景或背景?OS 轉印就是一個 Print Job 。如果說中文容易搞混,英文的話應該會明確的使用 Print 而不會用 Convert ,這樣翻譯成中文就是列印,而非是轉或是轉印這種容易搞混的用詞。

    2. XML 的確是標準,但問題 XPS 不是。XPS 是微軟自訂的東西,所以前面舉例的是用微軟自己搞的東西來說明。再舉一個例子吧,在 WPF 前微軟主推 VML ,在 2004 我曾經向 CSS 提了兩個 VML 的 bug 問題,美國那邊的回應是 VML 不再更新,所以不改。之後在 2004/6 左右, WPF 還在開發階段,還沒訂明,我也有提建議,建議支援 OpenGIS 的 GML (GML / VML / WMF 所用的格式都是 XML ,都是從 SVG 精簡出來) ,當時開發部門的回應是未來會支援,但是目前 WPF 是以裝置環境為主,如果跟 GML 相容的話,可能會有很大的改版問題,VB2005/2008 也有不少與舊版不相容的地方,向 CSS 反映後,最後美國產品部門回應未來版本不支援的情形也大概有十來個,到 Connect 網站搜尋搞不好更多,從既有的歷史就可以知道,微軟自己也做過很多不再相容支援的事情來,當然你可以選擇相信微軟,但是否有必要先透過 XPS 再列印?還是直接列印?我只能說個人有各人的選擇,這種選擇是取捨問題,就像你覺得這麼做好,我覺得這麼做不好,你有你的理由,我有我的看法。
    再舉一個例子,.Net 1.x 中是用 System.Web.Mail 發信,到了 .Net 2.0 以後被廢了,改用 System.Net.Mail 發信,我想也沒人敢保證 .Net 3.0 中 System.Windows.Xps 這個類別能長長久久吧~

    3. 我在原先的 3 中一直寫 WMF / EMF ,那是向量檔,向量檔不會有鋸齒狀的問題,只是會依照參照解析度而有解析度是否夠密。所以 EMF+ 才支援實數座標來盡量使用到最大解析度。以向量方式列印,本身不會有鋸齒狀問題,而解析度問題是針對精準列印而言。標準 Fax 是 150 或 200 DPI ,現在市面上的雷射印表機大概是 1200 DPI ,噴墨印表機則更高,假設從紙張邊界開始數,要在 (50mm, 50mm) 列印 5 mm 高的文字,在 200 DPI 下,會印在 (50.038 mm, 50.038 mm) 高 4.953 mm ,在 1200 DPI 下,則會印在 (49.996 mm, 49.996 mm) 高 4.996 mm ,300 DPI 則印在 (49.953 mm, 49.953 mm) 高 4.995 mm ,因此,DPI 主要反應在精準列印上,當然解析度差看起來內容會有鋸齒狀,看傳統傳真跟印表機列印的結果就可以看出結果的差異。此外參照印表機解析度是不用改向量檔,直接繪圖即可,因為那本身就已經針對裝置有最佳的結果。若是透過既定的東西轉換,就可能增加了額外的限制而不自知。套表或標籤紙時,重點是精準列印,而非自動換行,自動換行並非難事,以前控制項沒這麼方便時,都能輕鬆做到了,自動換行根本就不是重點。
    再舉個例子,假設你在 WPF 只用了整數座標來畫圖,長寬圖面範圍為 0 ~ 1000 ,則對應到 A4 的解析度為 120.95 DPI x 85.52 DPI ,而 1000 x 1000 在螢幕上可能剛剛好,但在印表機上則遠遠不足,當然印出來還是點是點、線是線,但在紙上則會有上下左右的進位偏移。
    註:XPS 最大解析度經查線上手冊確認為 600 DPI 而非先前憑印象寫的 300 DPI ,300 DPI 為 Microsoft Office Document Image Writer 最大值,Acrobat 預設值。

    4. 這部分就通論來說,很正確,就針對用途的應用來說,我想這是個人見解,你可以覺得 XPS 最讚,我可以覺得直接用 Graphics 在 Printer 上較優,論證過程各自引用資料,最後我認為這種討論不會有結果的,就像程式語言討論區每年都會來幾次哪種語言最好的辯論,最後都是沒有結論,自己爽最重要。
    2009年3月1日 上午 06:36
  • 心冷熱情熄大大.....
    您的最後一句話讓我不禁地由心底笑了....

    真的是如此, 自己感覺舒服最重要......
    一心只想學好程設~~~朝著目標前進
    2009年3月1日 上午 07:22
  • 1.菜,沒關係,最重要的是心態問題.菜好現象,最怕的是人很菜,心態卻很老,大家都是過來人.
    2.我不是學者,作者,所以語言可能不是表現得很好.
    3.我寫的文章是上述所有討論所寫得一些~算感想吧!,不是針對任何人.
    4.你把WPF 的17章看完後,應該可以將螢幕的資料送至印表機.至於Sample Code,上 MSDN,只是大部分是英文,而Sample Code 都是片段,要玩出來一個企業產品,需要自己慢慢去拼去整合.
    5.企業不斷的變,技術不斷的創新,沒有所謂的正不正確的問題.像我都是在工作不斷的讀,但很多東西是看過,沒用過.有的東西是看了後用猜的.但每次使用者有新需求時,你就可以很快的照你已知道的知識,很快找出很多方案,找一可比較可行的方式去做.(很多企業不會給你太多時間,空間去考慮,通常問你都只有幾分鐘你就要說出一些也許,大概,可能是都東西給老闆).
    2009年3月2日 上午 12:40
  • 謝謝 好說前輩 的鼓勵....你說的我也很認同....謝謝。

    聽你這麼說,我就安心了,開文之後,看到您跟心冷熱情熄前輩這樣地為這樣一個 issue 分別提出對我的建議,我是真的很感謝。

    不過,一則喜,一則憂,喜的是我這後生晚輩可以從兩位前輩的經驗及各別所看的角度中學到真的很多的東西及有可能的 Solution 和各別的優勢,但憂的是,我如上面所回文的內容所述,很怕因為這樣的討論會傷到您兩位前輩的和氣,所以,我也一度很緊張,不知如何適從~~~  > <

    最後,兩位前輩果然都是很有風度之人,對問題都能提出專業的看法,且也很慷慨解囊地教導我,真的是萬分的感激,看來我之前所想的真的是...多想了,在此再度地對兩位前輩表達最深的感謝之意,謝謝。

    嗯~~~  希望日後如果還有這方面的問題,再請兩位前輩再給我這後進給予指導,好嗎?  謝謝。
    一心只想學好程設~~~朝著目標前進
    2009年3月2日 上午 01:15