䌁業システムでの印刷の自動化、たたはプリンタヌず友達を䜜る方法

こんにちは、ハラゞテル 私はあなたず私の苊痛な経隓を共有したい、それが圹に立぀こずを願っおいたす。 今日は、䌁業システムでドキュメント印刷システムをどのように開発したかに぀いおお話したす。

それがすべお始たった方法


それはすべお、玄2幎前に1぀の商瀟でERPプラットフォヌムを開発するこずから始たりたした。 Linuxが遞択されたした。C++ / Qtスタック、PostgreSql、およびWebの前面です。 アプリケヌションサヌバヌはC ++ / Qtで実装され、同じ堎所で、ビゞネスロゞックはJSむンタヌプリタヌレむダヌを介しお蚘述されたした。 なぜ別の話なのか、ここでは印刷システムがどのように開発されたかを怜蚎したす。

ペンの最初のサンプル


HTML


最初は、すべおのドキュメントが1Cから印刷されおいたしたが1Cの束ず瀟内の管理䌚蚈に独自の「ERP」を䜿甚したす、すべおは順調でしたが、蚈画はシステムに切り替える予定でした。 その埌、システムにシヌルを固定する必芁がありたした。

最初のアむデアは、HTMLフォヌムをレむアりトし、プログラムでデヌタを入力し、ナヌザヌにブラりザヌにhtmlしお、そこから印刷できるようにするこずでした。

すぐにいく぀かのニュアンスを芋぀けたした

  1. すべおのドキュメントの䞋で、0からテンプレヌトを䜜成する必芁がありたす
  2. ゚ンドナヌザヌはhtmlを線集できたせん
  3. マネヌゞャヌはExcelでいく぀かの分析を䞻導したした
  4. 耇数ペヌゞのファむルを印刷するずきの行の折り返しの問題

その結果、ロゞスティクス単䞀ペヌゞフォヌムのアプリケヌションを印刷するためのテンプレヌトが1぀だけ䜜成されたしたが、これは匕き続き正垞に䜿甚されおいたす

Xlsx


2番目のアむデアは、XLSXドキュメントで䜜業するこずでした。 GoogleはすぐにQtXlsxWriterラむブラリに぀いおプロンプトを出したした。 ただオプションがありたしたが 、最終的にはQtXlsxWriterに萜ち着きたした。

ラむブラリでできるこず


これにより、他のシステムHi 1Cからxlsx圢匏のドキュメントテンプレヌトを取埗するコストを即座に削枛し、必芁なデヌタず統蚈情報を入力しお、ナヌザヌが奜きなように䜜業できるxlsxファむルをナヌザヌに提䟛できたした。

萜ずし穎がすぐに珟れ、QtXlsxWriterはテンプレヌトからのドキュメントの読み蟌み、セル圢匏の喪倱ラップ/アリングなどを「䞍十分」に凊理したした。 「xlsx圢匏誰も知らない堎合、xlsxはxmlドキュメントのセットを含むzipアヌカむブを数時間掘り䞋げた埌、ブヌルの異なるバヌゞョンでは、xmlファむルの属性が異なる方法で栌玍されおいるこずがわかりたした。

<ta="0" b="1" /> 

どちらか

 <ta="true" b="false" /> 

parsilの堎所のQtXlsxWriterは1/0のみ、true / falseの堎所のみ、およびthisずthatの堎所もありたす。 しかし、䜕も、固定された手がありたす。

たた、QtXlsxWriterを介しおxlsxファむルが圢成された埌、MS Officeで開くず、それが宣誓され始めお䞍快な瞬間がありたした。
本「test1.xlsx」で、読むこずができないコンテンツが芋぀かりたした。 本の内容を埩元しおみおください ゜ヌスを信頌する堎合...

同時に、芖芚的に開いた埌、すべおのデヌタが配眮されたした。 ただし、䟡栌衚を開くず、倚くの䞀般ナヌザヌ顧客がこのようなメッセヌゞを恐れるこずがありたす。

MS OfficeずQtXlsxWriterをxmlファむルに䜕時間も貌り付けお怜玢した埌、 なぜ MSがそれを気に入らなかったのかわかりたせん 。束葉杖が発明されたした。 QtXlsxWriterによっお生成されたファむルを取埗し、 LibreOfficeを䜿甚しお凊理する堎合、元のすべおのデヌタを含む有効なxlsxファむルを取埗したすが、MS Officeはそれを誓いたせん

 libreoffice --headless --invisible --quickstart --convert-to xlsx test.xlsx --outdir valid_xlsx 

そしお、生きおいくのは良いこずでした。xlsxドキュメントの圢成に関する必芁なレポヌト甚の小さなコヌドが䜜成され、ナヌザヌにアップロヌドされ、必芁に応じお䜜業し、MS Officeはそれらを怖がらなくなりたした。 圌らはグルヌプず遊女でxlsxのOLAPレポヌトをアンロヌドするこずさえできたした。

自動化


䌚瀟が成長し、顧客が増え、ドキュメントアプリケヌション、販売、請求曞などが増え、印刷に倚くの䜜業時間がかかり始めたした。 さらに、ドキュメントの䞀郚は、システムの1C郚分から印刷されたした。 この問題を䜕らかの圢で自動化するこずにしたした。 これに先立っお玄5〜7幎前、Windows OLEコンテナヌコンテナヌはExcelで䜜成され、ファむルが開かれ、印刷蚭定が蚭定されお印刷に送信されたしたを介しお印刷した経隓がありたしたが、実際にはLinuxで回転しおドラッグしおいるプラ​​ットフォヌムではありたせんここではWindowsモゞュヌルは必芁ありたせんでしたただし、Windows䞊のプリントサヌバヌは極端なオプションず芋なされおいたした。

すべおPDFで


LinuxにはCUPSがあり、lprコマンドを䜿甚するず、印刷甚のpdfファむルを簡単に送信できたす。 これはただのpdfであり、生成方法がわかりたせん。 解決策はすぐに芋぀かりたした。

 libreoffice --convert-to pdf 1.xlsx --headless 

しかし、それはそれほど単玔ではありたせんでした。 ファむルは100スケヌルで倉換され、ペヌゞサむズA4 / A3、ポヌトレヌト/ランドスケヌプ、むンデントに適合しなかったか、むしろすべおが暙準パラメヌタヌA4、ポヌトレヌトに埓っお調敎されたした。 LibreOfficeLibreOffice Calcを手で開くでこれらの蚭定を蚭定し、xlsxで保存し、libreoffice --convert-to pdfで倉換するず、すべおがほが完璧に機胜するこずがわかりたした。

  1. むンデントずペヌゞ蚭定が正しく凊理されたした。
  2. スケヌルを調敎する必芁がある堎合、このパラメヌタヌは無芖され、100のスケヌルで倉換されたした。
  3. サむズ/ペヌゞ数に合う蚭定があれば、すべおが機胜したした

ポむント2に぀いお、私はLibreOfficeのサポヌトを停止したした。圌らからの連絡を楜しみにしおいたす。

パラグラフ3の利点は正しく機胜するこずであり、それを基に構築するこずにしたした。 次に、QtXlsxWriterにペヌゞ蚭定を操䜜する方法を教える必芁がありたす。 xlsxドキュメント内のxmlファむルを発芋するず、このビゞネスに責任のある堎所が芋぀かりたした

xl / worksheets / sheet1.xml

 <worksheet> <sheetPr filterMode="false"> <pageSetUpPr fitToPage="false"/> </sheetPr> ... ... <pageMargins left="0.7875" right="0.7875" top="1.05277777777778" bottom="1.05277777777778" header="0.7875" footer="0.7875"/> <pageSetup paperSize="9" scale="50" firstPageNumber="0" fitToWidth="1" fitToHeight="1" pageOrder="downThenOver" orientation="portrait" usePrinterDefaults="false" blackAndWhite="false" draft="false" cellComments="none" useFirstPageNumber="false" horizontalDpi="300" verticalDpi="300" copies="1"/> ... </worksheet> 

ここで興味深いのは
pageMargins-これですべおが明確になったず思う
fitToPage-サむズ/ペヌゞ数に合わせる、たたはスケヌルを䜿甚する
fitToWidth-幅のペヌゞ数
fitToHeight-高さのペヌゞ数
スケヌル-スケヌル
paperSize-シヌトサむズ9 = A4
向き-瞊/暪

QtXlsxWriterでこれらのパラメヌタヌを䜿甚した䜜業を远加したした。 䞍完党なコンテンツの断片が別のシヌトに印刷されないように、適切な堎所にむンデントを䜿甚しおxlsxドキュメントを圢成するだけです。 これにより、すべおが非垞に単玔であるずは限りたせんでした。

印刷する


むンデントなしで、A4ブックの向きのシヌトにルヌトシヌトを印刷する堎合の状況を考慮しおください。

ルヌトシヌトの䟋


この堎合、ドキュメントの幅が1ペヌゞに収たる必芁がありたす。 蚭定を行いたす

fitToPage = false
fitToWidth = 1
fitToHeight = 100
pageMargins-すべお0

これらの条件䞋では、fitToHeightは、印刷時に予想されるペヌゞ数よりも倧きいこずがわかっおいる必芁がありたす。

ルヌトリストは、ルヌトず内線番号を持぀顧客のリストを瀺す芋出しです。 どの配信が行われるかに関する情報。

そのたたにしおおくず、シヌトの最埌にある顧客情報を含むブロックの䞀郚が砎損し、䞀郚が最初の最埌にあり、䞀郚が2番目の先頭にある可胜性があり、これは受け入れられたせん。

その結果、次のアプロヌチが生たれたしたおそらく束葉杖。

最初に、A4シヌトサむズを知っおいたす。
幅21cm
高さ29.7 cm

そしお、コンテンツがシヌトの幅に合わせお調敎されるこずを知っおいたす。 コンテンツの盞察圧瞮率を蚈算できたす

スケヌル=シヌトの幅/コンテンツの幅

ここで、コンテンツの幅を蚈算するために、すべおの列の幅を远加する必芁がありたす。これは難しくありたせん。

 double QXlsx::Document::columnWidth(int column); 

どの枬定単䜍で結果が埗られるかはたったく理解できたせんでした。 おそらくここで正しい解決策を芋぀けるこずができたすが、最終的には、マゞック番号5.10238を経隓的に芋぀けるこずはできたせんでした
1 cm = 5.10238 e.sh. 列幅の単䜍

 scale = 4_ * 5.10238 / sum(columnWidth) 

次に、シヌトの幅党䜓に合わせるこずができるコンテンツのサむズを蚈算したす

 height=4_ * 28.3464567 / scale 

行の高さをe.i.v.s行の高さを枬定するための単䜍、むンタヌネット䞊でこの情報が芋぀かりたした„ r.Height = ht * 28.3464567 // CMをポストスクリプトポむントに倉換 "

行の高さは次の方法で確認できたす。

 double QXlsx::Document::rowHeight(int column); 

heightパラメヌタを䜿甚しお、コンテンツの高さが<= heightである間に、コンテンツをxlsxファむルにハンマヌで打ち蟌みたす。 新しいブロックBを远加するずきに、高さの境界を超える堎合、Bの前に必芁な高さの空の行を挿入しお、ブロックBが新しい行から印刷されるようにしたす。 空行の高さは、ブロックBの前に挿入されたコンテンツの高さsumrowHeightを知るこずで蚈算できたす。

ここでは、むンデントpageMarginsを䜿甚したペヌゞネヌションの蚈算は考慮しおいたせん。xmlデヌタにはこれらの倉数の倀がむンチ1むンチ= 2.54 cmで栌玍されおいるずしか蚀えたせん。

したがっお、既補の蚭定ず印刷甚の行ごずの内蚳を含むxlsxファむルが取埗されたす。 次に、libreoffice --convert-to pdfを䜿甚しおpdfに倉換するず、ドキュメントを印刷する準備ができたした。

印刷するたたです

 lpr -pFS-4300DN test.pdf 

珟圚、フィニッシャヌステヌプル留めを備えた倚機胜デバむスでの印刷の自動化を行っおいたす。 すでにテスト装眮で少し遊んでいお、Linuxのもずでは、それはすべおステヌプリングのためだけでした。

巊䞊隅にクリップが1぀あるステヌプル印刷

 lpr -P printer_name -o StapleLocation="UpperLeft" order.pdf 

終わり


以䞊です。 このタスクの実装に察する他のアプロヌチを知っおうれしいです。

ご枅聎ありがずうございたした

Source: https://habr.com/ru/post/J325586/


All Articles