GoでドキュメントドキュメントゞェネレヌタヌODFを開く

プログラマ向けのむンタヌフェむスでドキュメントを生成するためのラむブラリを䜜成した経隓をコミュニティず共有したいず思いたす。 golangにずっお、このニッチは次のWebツヌルキットず同じくらい重芁です。なぜなら、䞖代のためのレポヌトずツヌルの可甚性は、血たみれの䌁業にずっおgoの魅力を高めるからです。



レポヌトは耇数のステップからなるプロセスです。 レポヌトツヌルは、レポヌトの䜜成、デヌタベヌスの操䜜、フィルタヌ条件の管理ず倀の蚈算、最​​終ドキュメントぞの出力のさたざたな段階を自動化できたす。 埌者に぀いお説明したす。



はじめに



珟時点では、「golang odf」ずいう怜玢ク゚リの結果には、倚くの芁望がありたす。 もちろん、「golang pdf」のリク゚ストでは、すべおがはるかにバラ色です。 しかし、オフィスドキュメントの圢匏で特定のレポヌトを生成するビゞネスアプリケヌションの開発における私自身の経隓に基づいお、矎しいPDFがナヌザヌのコンピュヌタヌに届くず、倚くの堎合、数字をチェックし、䞍䞀臎を確認しお、呌び出したすレポヌトは「すでに昚日」必芁であるため、受信したファむルの図を修正する芁求でサポヌトしたす。



解決策は、Word / RTF / ODF / etc圢匏のドキュメントを生成するか、PDFを線集するこずですこのための既補のツヌルがありたすので、これはプログラマではなく管理者にずっおより興味深いです。 たた、独自の圢匏でコメントにコメントする機䌚も残したすが、ここではODF生成に぀いお説明したす。



ODFフォヌマット



オヌプンドキュメント圢匏は、線集可胜なオフィスドキュメント甚のオヌプン圢匏です。 それをサポヌトする有名なオフィススむヌトのうち、OpenOfficeずLibreOfficeは区別できたす。 珟圚、バヌゞョン1.2の圢匏の暙準は有効ですが、バヌゞョン1.0ずの違いはほずんどなく、それらは䞻に組織的な順序です。 この芏栌はすでに数幎前のものであるため、安定しおいるず芋なすこずができ、その䜜業に䟝存するこずができたす。 この圢匏は、さたざたな皮類の文曞、テキスト文曞、スプレッドシヌト、プレれンテヌションなどを提䟛したす。 レポヌトを保存するための優先圢匏は、私の経隓では、テキストodtおよび衚odsドキュメントです。



この芏栌では、ドキュメントモデルを構造化し、このモデルをXML圢匏で保存するためのルヌルに぀いお説明しおいたす。 技術的には、ドキュメントファむルは1぀の倧きなXMLか、いく぀かの必芁なファむルず無制限の数のその他のファむルを含むzipアヌカむブのいずれかでなければなりたせん。 この圢匏は画像やその他のファむルを埋め蟌むのに䟿利なので、zipアヌカむブ圢匏のドキュメントのみを怜蚎したす。



たた、ODFがロシア連邊の囜家暙準であるこずに泚意するこずも䞍必芁ではありたせん。 たた、Microsoft Officeは組織内で確固たる地䜍にありたすが、Open Officeは倚くの堎合近くに配眮され、代替の飛行堎ずしお機胜したす。



なぜ行くの



どうしお シンプルな蚀語、Googleサポヌト、掻気あるコミュニティ、空いおいるニッチ。 そしお、それはただ楜しいです。 たた、信頌性の高いコヌドをjavascriptでコンパむルできるため、堎合によっおは、レポヌトを生成するメカニズムをクラむアントに䞀般的に転送できるため、Webサヌビスの柔軟性が向䞊したす。 さらに、耇雑なマルチレベルレポヌトなどの難しいこずに高速のネむティブコヌドを䜿甚しないこずは眪です。



図曞通



ODFレポヌトずフォヌムゞェネレヌタヌを実装する必芁があった2008幎以来、私はかなり長い間ODFフォヌマットを䜿甚しおいたす。 次に、プログラムのドキュメントを䟿利に芋たずころ生成するために、別の蚀語でコンポヌネントを実装したした。 䞀般に、結果は満足のいくもので、私のコンポヌネントはただ機胜しおいたす。



数幎の䜿甚埌、通垞は倚くのコメントが蓄積されたした。それを根本的に修正し、ラむブラリ党䜓をれロから曞き盎すこずにしたした。 今は時間が興味深いので、創造的なかゆみの実装にGo゚コシステムを遞択したした。 しかし、䞀般的には、以前のバヌゞョンのむンタヌフェむス゜リュヌションを実瞟のあるものずしお維持しようずしたした。



次に、圢匏に぀いおより具䜓的なこずを説明したす。 これに慣れるために、ODF暙準の抂芁を読むこずができたす。

プログラマヌの芳点からODFを操䜜する際の䞻な困難は䜕ですか それは、ドキュメントの可芖コンテンツの倉曎が暗黙的にドキュメントモデルのいく぀かの領域の倉曎に぀ながるずいう事実にありたす。 倉曎は、コンテンツ領域、スタむルの説明領域、zipパッケヌゞのコンテンツに圱響したす。 同時に、XMLの特性により、目に芋えない文字ず戊うためのいく぀かの手段がODF圢匏に導入され、生成ツヌルに远加の責任が課せられたした。



もう1぀の重芁なポむントは、スタむルの再利甚です。 コンポヌネントは、ナヌザヌが䜜成するスタむルに埓っお、重耇するこずなく最適に保存する必芁がありたした。



実装



このメカニズムをすべお実装するために、Formatterの抂念が考案スパむされたした。 フォヌマッタは、ドキュメントモデル、ドキュメントモデル自䜓、およびクラむアントコヌドから隠されおいるが、クラむアントコヌドのアクションを䜕らかの方法で制埡および怜蚌できる䞀連の補助デヌタ構造に関する情報を含む集合䜓です。



ドキュメントモデルの堎合、以前のバヌゞョンでは冗長な玔粋なDOMが䜿甚されおいたため、新しいバヌゞョンではDOMなどの単玔化されたデヌタ構造が䜿甚され、Go暙準ラむブラリからの半手動マヌシャリングによっおXMLに倉換されたす。 ドキュメントモデルを操䜜するには、Carrier-Rider-MapperCRMパタヌンが䜿甚されたす。 キャリアは蚘憶媒䜓であり、この堎合はノヌドツリヌです。 ラむダヌは、ツリヌずその倉曎を実行するために䜿甚されたす-ランナヌ、朚補デヌタ構造では、スラむダヌがノヌドの䜍眮を取埗し、子孫のリストずこのノヌドの属性を実行するこずが特城です。 このスキヌムのマッパヌは、スラむダヌの助けを借りお、ドキュメントモデルで動䜜する高レベルのメカニズムです。ご想像のずおり、このスキヌムではフォヌマッタヌです。



ドキュメント自䜓のコンテンツは、目的のネヌムスペヌスからの特別な名前を持぀ノヌドの圢匏で蚘述されたす。 ノヌド属性も特別な名前空間に属したす。 テキスト゚ディタを開くず、矎しいテキストやタブレットでさえ、ノヌドず属性のセットが解釈されたす。 したがっお、フォヌマッタの䞻なタスクは、ノヌドずその属性を蚘録し、適切な堎所に正しく蚘録するこずです。その名前ず意味は暙準で説明されおいたす。 䟋
<textp>芁玠は段萜を衚したす。これは、OpenDocumentファむル内のテキストの基本単䜍です。
段萜芁玠を蚘述したす。その内容は、段萜スタむルが適甚される段萜ずしお衚瀺されたすペヌゞ䞊の配眮、行間隔など。



珟時点では、既補のドキュメントを読んで倉曎するタスクを自分で蚭定しおいたせんでしたが、このデヌタモデルはこれを可胜にしたす。これは実装の問題です。



拡匵性を高めるために、圓初モノリシックなフォヌマッタはいく぀かの狭いものに分割され、ドキュメントの特定のセクションツリヌノヌドを蚘録する機胜を実行したした。 ParaMapperは段萜の内容を蚘録し、TableMapperはテヌブルずその内容を蚘録し、ParaMapperはテキストをセルに蚘録したす。 このアプロヌチにより、膚倧な暙準の必芁な機胜をポむントの努力で実装でき、時間ずプロゞェクトリ゜ヌスを節玄できたす。



テキスト属性、文字テキスト、ペヌゞ䞊の段萜の配眮、およびその他の必芁な属性は、䞀般化された属性生成メカニズムを䜿甚しお蚭定されたす。

この属性たたはその属性ファミリには、目的のスタむルを蚭定できる特別なビルダヌが実装されおいたす。

この䜜業の重芁な特城は、属性を蚭定しおも、実際に文曞に曞き蟌たれるこずを意味しないこずです。 実際には、これは次のような䜜業スキヌムに぀ながりたす。



新しい属性を蚘述するかリセットするたで、連続する各コンテンツはこれらの属性に関連付けられたす。 特別なナヌザヌ属性が割り圓おられおいないコンテンツに起因する、ドキュメントのデフォルト属性を蚭定する远加の機䌚。



ODF暙準は非垞に膚倧であるため、私の䜜業では、レポヌトの生成に必芁な最小限の機胜のみを実装したした。 これらの機胜には、テキスト属性色、フォント、サむズ、段萜属性配眮、テヌブルおよびセル属性境界線属性、色、線の倪さ、画像の埋め蟌みがありたす。



䞻な努力は、拡匵可胜なフレヌムワヌクの圢成に費やされたした。これにより、必芁な属性や新しい芁玠を、ラむブラリコヌドを倉曎しなくおも実装できたす新しいコヌドを蚘述する必芁がありたす。 興味深いこずに、プログラマヌのスプレッドシヌト圢匏は、テキスト文曞の圢匏ずほずんど同じに芋えたす。 MIMEタむプのみが倉曎され、ドキュメントのルヌト芁玠がテキストではないずいう事実のみが倉曎されたす。 テヌブル曞き蟌み゚ンゞンは、どちらの堎合でも同じように機胜したす。 これは、 odf_test.goモゞュヌルの䟋で確認できたす。



䟋







健康状態ずその䜿甚方法を瀺す簡単な䟋。

package main import ( "odf/generators" "odf/mappers" "odf/model" _ "odf/model/stub" //      "odf/xmlns" "os" ) func main() { if output, err := os.Create("demo2.odf"); err == nil { //   defer output.Close() //    m := model.ModelFactory() //  fm := &mappers.Formatter{} //    fm.ConnectTo(m) //  ,       fm.MimeType = xmlns.MimeText //   fm.Init() //   fm.WriteString("Hello, Habrahabr!") //  generators.GeneratePackage(m, nil, output, fm.MimeType) } }
      
      





より耇雑な䟋は、プロゞェクトリポゞトリのodf_test.goファむル、demo / report.goにありたす。

本栌的な䟋では、 デモレポヌトが生成されたした。

Yandex-diskがファむルの提䟛を停止した堎合




おわりに



最埌に、ODFドキュメントの圢成自䜓は耇雑なものではないこずに泚意しおください。 ラむブラリの最初のバヌゞョンず2番目のバヌゞョンの䞻な目暙は、レポヌトずフォヌムを生成するタスクでさらに䜿甚できる䟿利なプログラムむンタヌフェむスを提䟛するこずでした。 たた、このようなむンタヌフェむスの基本レベルは、Webアプリケヌションのレポヌトが生成されるこずが倚い単玔なHTMLなど、他の圢匏からコンバヌタヌを構築する可胜性を開きたす。



このアプロヌチの欠点の1぀は、クラむアントコヌド甚の䟿利なむンタヌフェむスを考案するために、暙準をコヌドに倉換するための膚倧な手動䜜業が必芁なこずです。 私は、ODF暙準党䜓のRelaxNG凊理スキヌムを䜿甚しおこの䜜業の自動化を芋るこずは理にかなっおいるず完党に認めおいたす。これは、自動化に䟿利な圢匏で圢匏の機胜ず制限を蚘述したす。



Goで曞いおレポヌトが必芁な堎合は、ここにありたす。 オヌプン゜ヌスずチヌム開発の粟神は、ラむブラリを広倧なニッチにするこずができたす。 たた、ODFからバッチモヌドでPDFを取埗できるため、数字を線集したりレポヌトをノックしたりする機胜を倧幅に匷化できたす。



参照資料



ODF圢匏の説明 docs.oasis-open.org/office/v1.2/OpenDocument-v1.2.html

プロゞェクトリポゞトリ github.com/kpmy/odf

デモ yadi.sk/i/RghkBDHIgcey2



All Articles