{"id":1236,"date":"2017-08-11T22:00:45","date_gmt":"2017-08-11T19:00:45","guid":{"rendered":"http:\/\/guvensahin.com\/?p=1236"},"modified":"2020-05-12T23:50:51","modified_gmt":"2020-05-12T20:50:51","slug":"dynamics-ax-ile-server-side-pdf-yazdirma-islemi","status":"publish","type":"post","link":"https:\/\/guvensahin.com\/tr\/dynamics-ax-ile-server-side-pdf-yazdirma-islemi\/","title":{"rendered":"Dynamics AX ile Server-Side PDF Yazd\u0131rma \u0130\u015flemi"},"content":{"rendered":"<p>Bir projede dynamics ax&#8217;\u0131n hem 2009 hemde 2012 s\u00fcr\u00fcm\u00fc ile a\u011fda bulunan bir yaz\u0131c\u0131dan, harici pdf dosyalar\u0131n\u0131n d\u00fczenli olarak \u00e7\u0131kt\u0131s\u0131n\u0131 almam gerekti. Buradaki en b\u00fcy\u00fck sorun koddan pdf yazd\u0131rabilmek. Bu X++ dan de\u011fil pdf format\u0131n\u0131n kendisi sebebiyle s\u0131k\u0131nt\u0131l\u0131 bir durum. \u00c7o\u011fu programlama dili ve yaz\u0131c\u0131 native olarak pdf format\u0131n\u0131 <a href=\"https:\/\/stackoverflow.com\/questions\/5566186\/print-pdf-in-c-sharp\">desteklemiyor<\/a>. PDF&#8217;i yazd\u0131rabilmek i\u00e7in third party ara\u00e7lar kullanman\u0131z gerekiyor. \u00c7e\u015fitli ara\u015ft\u0131rma ve denemelerden sonra sonuca ula\u015ft\u0131m. Ad\u0131m ad\u0131m yapal\u0131m.<\/p>\n<p>\u0130\u015flemlere ba\u015flamadan \u00f6nce yapmam\u0131z gereken ilk \u015fey \u00e7\u0131kt\u0131 almak istedi\u011finiz a\u011f yaz\u0131c\u0131s\u0131n\u0131 AOS makinas\u0131na tan\u0131tmak. AOS makinas\u0131na admin kullan\u0131c\u0131s\u0131 ile ba\u011flan\u0131p, denetim masas\u0131ndaki yaz\u0131c\u0131lar b\u00f6l\u00fcm\u00fcnden kullanaca\u011f\u0131n\u0131z a\u011f yaz\u0131c\u0131n\u0131z\u0131 tan\u0131t\u0131n. Ard\u0131ndan AX da \u00e7\u0131kt\u0131 almak i\u00e7in a\u015fa\u011f\u0131daki kodu kullanabilirsiniz. Fakat sadece bu kadarla bitmiyor.<\/p>\n<p>&nbsp;<\/p>\n<pre>public static void printFile(str _filePath, int _copies = 1)\r\n{\r\n    PrinterName                         printerName;\r\n\u00a0 \u00a0 System.Diagnostics.ProcessStartInfo processInfo;\r\n\u00a0 \u00a0 System.Diagnostics.Process          process;\r\n\u00a0 \u00a0 System.Exception                    interopException;\r\n    str                                 args;\r\n    str                                 exePath;\r\n    ;\r\n\r\n    printerName = AYXAutoInvoicingParameters::find().InvoicePrinterPath;\r\n\r\n    try\r\n    {\r\n        new InteropPermission(InteropKind::ClrInterop).assert();\r\n\r\n\r\n        args = strfmt('-s \"%1\" -prn \"%2\" -copies %3 \"-alerts_no\"', _filePath, printerName, _copies);\r\n        exePath = @\"C:\\Program Files (x86)\\2Printer\\2Printer.exe\";\r\n\r\n        process = new System.Diagnostics.Process();\r\n\r\n        processInfo = process.get_StartInfo();\r\n        processInfo.set_FileName(exePath);\r\n        processInfo.set_Arguments(args);\r\n\r\n        processInfo.set_CreateNoWindow(true);\r\n        processInfo.set_WindowStyle(System.Diagnostics.ProcessWindowStyle::Hidden);\r\n\r\n        process.Start();\r\n\r\n        CodeAccessPermission::revertAssert();\r\n    }\r\n    catch (Exception::CLRError)\r\n\u00a0 \u00a0 {\r\n\u00a0 \u00a0 \u00a0 \u00a0 interopException = CLRInterop::getLastException();\r\n\u00a0 \u00a0 \u00a0 \u00a0 while (!CLRInterop::isNull(interopException.get_InnerException()))\r\n\u00a0 \u00a0 \u00a0 \u00a0 {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 interopException = interopException.get_InnerException();\r\n\u00a0 \u00a0 \u00a0 \u00a0 }\r\n\r\n        error(_filePath);\r\n\u00a0 \u00a0 \u00a0 \u00a0 error(strFmt(\"Hata: %1\", CLRInterop::getAnyTypeForObject(interopException.get_Message())));\r\n        throw error(\"Dosya yazd\u0131r\u0131lamad\u0131.\");\r\n\u00a0 \u00a0 }\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>\u00d6ncelikle bu kodun\u00a0server-side \u00e7al\u0131\u015fmas\u0131 gerekiyor. Nas\u0131l yap\u0131laca\u011f\u0131n\u0131 bilmeyenler\u00a0<a href=\"http:\/\/axdaily.blogspot.com.tr\/2010\/02\/moving-code-execution-from-client-to.html\">buradaki<\/a> makaleden faydalanabilir.<\/p>\n<p>Yukar\u0131daki kodda yapt\u0131\u011f\u0131m\u0131z i\u015flem X++ \u00fczerinden .NET&#8217;in &#8220;<span class=\"typ\">System<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Diagnostics<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Process<\/span>&#8221; s\u0131n\u0131f\u0131n\u0131 kullanarak AOS makinas\u0131nda belirli parametrelerle pdf&#8217;imizi yazd\u0131racak bir exe \u00e7al\u0131\u015ft\u0131rmak. Exe pdf dosyam\u0131z\u0131n yolunu, yazd\u0131rmak istedi\u011fimiz yaz\u0131c\u0131n\u0131n yolunu ve kopya say\u0131s\u0131 gibi istedi\u011fimiz bilgileri al\u0131p yazd\u0131rmay\u0131 yap\u0131yor. \u0130\u015flemi bitirdiken sonra ise kendini otomatik kapat\u0131yor. O sebeple &#8220;process.Start()&#8221; ifadesinden sonra exe&#8217;nin durumunu kontrol etmiyorum. Asenkron \u00e7al\u0131\u015f\u0131yor. Buda bize performans kazand\u0131r\u0131yor.<\/p>\n<p>Ben bu \u00f6rnekde ise <a href=\"https:\/\/www.doc2prn.com\/\">2Printer<\/a> isminde lisansl\u0131 bir ara\u00e7 kulland\u0131m. Kendisi pdf format\u0131n\u0131 destekleyen command line batch printing tool&#8217;udur. Yukar\u0131daki kodu kullanabilmek i\u00e7in bu uygulamay\u0131 AOS makinas\u0131na kurmal\u0131s\u0131n\u0131z. Free olarakda kullan\u0131labiliyor fakat <a href=\"https:\/\/www.doc2prn.com\/order\">baz\u0131 k\u0131s\u0131tlamalar\u0131<\/a> var. Tabi tek \u00e7\u00f6z\u00fcm bu de\u011fil. Tamamiyle \u00fccretsiz alternatiflerde var. Gelin inceleyelim&#8230;<\/p>\n<p>&nbsp;<\/p>\n<h2>Batch PDF Printing<\/h2>\n<p>2Printer yerine <a href=\"https:\/\/get.adobe.com\/tr\/reader\/\">Adobe Acrobat Reader<\/a>, <a href=\"https:\/\/www.foxitsoftware.com\/pdf-reader\/\">Foxit Reader<\/a> gibi yaz\u0131l\u0131mlar\u0131da kullanabilirsiniz. Kullan\u0131m \u015feklimiz ayn\u0131. Tek yapman\u0131z gereken bu ara\u00e7lar\u0131 AOS makinas\u0131na kurmak. Sonras\u0131nda kodda exe path&#8217;ini ve alaca\u011f\u0131 parametre format\u0131n\u0131 g\u00fcncellemek. Ama\u00e7 bu uygulamar\u0131 headless olarak gui olmadan \u00e7al\u0131\u015ft\u0131rmak ve yazd\u0131rma i\u015flemini tamamlad\u0131ktan sonra kapatmak. Fakat 2Printer dan farkl\u0131 olarak:<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Adobe Acrobat Reader<\/strong>: Command line \u00fczerinden \u00e7al\u0131\u015fmaya uygun de\u011fil. Komut ile \u00e7al\u0131\u015ft\u0131rmak istedi\u011finizde mutlaka GUI a\u00e7\u0131yor ve yazd\u0131rmadan sonra kendini otomatik kapatm\u0131yor. Command printing i\u00e7in kendisinin \u00fccretli API&#8217;si mevcut. Fakat <a href=\"https:\/\/www.bincsoft.com\/blog\/background-printing-of-pdf-documents\/\">burada<\/a> anlat\u0131lana g\u00f6re \u00e7ok yava\u015f. Eski versiyonlar\u0131n\u0131n command line \u00fczerinden \u00e7al\u0131\u015fmaya elveri\u015fli oldu\u011funu okumu\u015ftum. Test edip uygun s\u00fcr\u00fcm bulunabilir.<\/p>\n<p><strong>Foxit Reader<\/strong>: Command line \u00fczerinden \u00e7al\u0131\u015fmaya uygun. Parametre olarak pdf dosyas\u0131n\u0131 ve yaz\u0131c\u0131 yolunu verip \u00e7\u0131kt\u0131 alabilirsiniz. Herhangi bir GUI a\u00e7m\u0131yor. Fakat process&#8217;i kendini otomatik kapatmayabiliyor. 1-2 sn bekleyip kendiniz koddan kill etmelisiniz. Ayr\u0131ca kopya say\u0131s\u0131, renkli\/siyah-beyaz vs detayl\u0131 komutlar\u0131 desteklemiyor.<\/p>\n<p>\u00d6rne\u011fin 3 kopya almak isterseniz exe&#8217;yi 3 defa \u00e7a\u011f\u0131r\u0131p her seferinde bitmesini bekliyorsunuz. 6-7 saniye s\u00fcren bu s\u00fcre\u00e7 yukar\u0131da bahsetti\u011fim asenkron \u00e7al\u0131\u015fan 2Printer ile 1 sn s\u00fcrm\u00fcyor. E\u011fer performans sorununuz yoksa tavsiye ederim.\u00a0<a href=\"https:\/\/www.bincsoft.com\/blog\/background-printing-of-pdf-documents\/\">Buradaki yaz\u0131y\u0131<\/a> inceleyerek entegre edebilirsiniz.<\/p>\n<p><strong>Native<\/strong>: Baz\u0131 yaz\u0131c\u0131lar\u0131n kendili\u011finden pdf deste\u011fi olabiliyor. Bu yaz\u0131c\u0131lar i\u00e7in tek yapman\u0131z gereken yaz\u0131c\u0131n\u0131n a\u011fdaki yoluna pdf dosyas\u0131n\u0131 kopyalamak. Bunu yapt\u0131\u011f\u0131n\u0131zda, yaz\u0131c\u0131 varsay\u0131lan ayarlar\u0131 ile pdf&#8217;i yazd\u0131racakt\u0131r. \u00d6rne\u011fin bir m\u00fc\u015fterimin ofisindeki\u00a0<em>Konica Minolta <\/em>marka insan ebat\u0131ndaki yaz\u0131c\u0131 hi\u00e7 bu toollara ihtiya\u00e7 kalmadan bu i\u015fi halletti.<\/p>\n<p><strong>Kendimiz yazal\u0131m:<\/strong>\u00a0Bu ihtimalde akl\u0131n\u0131za gelebilir. Fakat ilk ara\u015ft\u0131rmalar\u0131mda c# i\u00e7in \u00f6n\u00fcme \u00e7\u0131kan b\u00fct\u00fcn pdf k\u00fct\u00fcphaneleri \u00fccretliydi. K\u00fct\u00fcphaneye para vermek yerine direkt tool&#8217;u almak daha mant\u0131kl\u0131.<\/p>\n<p>Bu konuyu ciddi kafaya takm\u0131\u015f durumday\u0131m :) c# i\u00e7in \u00fccretsiz bir pdf k\u00fct\u00fcphanesi bulursam a\u00e7\u0131k kaynak ve tamamen \u00fccretsiz bir command line printing tool&#8217;u yazmay\u0131 d\u00fc\u015f\u00fcn\u00fcyorum. Yazd\u0131\u011f\u0131m takdirde bu yaz\u0131ya link veriyor olurum. E\u011fer sizin bildi\u011finiz, kulland\u0131\u011f\u0131n\u0131z ara\u00e7lar varsa yorumlarda payla\u015fabilirsiniz.<\/p>\n<p>&nbsp;<\/p>\n<p>Ho\u015f\u00e7akal\u0131n.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bir projede dynamics ax&#8217;\u0131n hem 2009 hemde 2012 s\u00fcr\u00fcm\u00fc ile a\u011fda bulunan bir yaz\u0131c\u0131dan, harici pdf dosyalar\u0131n\u0131n d\u00fczenli olarak \u00e7\u0131kt\u0131s\u0131n\u0131 almam gerekti. Buradaki en b\u00fcy\u00fck sorun koddan pdf yazd\u0131rabilmek. Bu X++ dan de\u011fil pdf format\u0131n\u0131n kendisi sebebiyle s\u0131k\u0131nt\u0131l\u0131 bir durum. \u00c7o\u011fu programlama dili ve yaz\u0131c\u0131 native olarak pdf format\u0131n\u0131 desteklemiyor. PDF&#8217;i yazd\u0131rabilmek i\u00e7in third party&hellip;&nbsp;<a href=\"https:\/\/guvensahin.com\/tr\/dynamics-ax-ile-server-side-pdf-yazdirma-islemi\/\" rel=\"bookmark\">Daha fazlas\u0131n\u0131 oku &raquo;<span class=\"screen-reader-text\">Dynamics AX ile Server-Side PDF Yazd\u0131rma \u0130\u015flemi<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":1241,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"categories":[234,239],"tags":[365,193,198,362,285],"class_list":["post-1236","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dynamics-ax","category-programlama","tag-2printer","tag-axapta","tag-dynamics-ax-2","tag-pdf","tag-x"],"_links":{"self":[{"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/posts\/1236","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/comments?post=1236"}],"version-history":[{"count":22,"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/posts\/1236\/revisions"}],"predecessor-version":[{"id":1259,"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/posts\/1236\/revisions\/1259"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/media\/1241"}],"wp:attachment":[{"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/media?parent=1236"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/categories?post=1236"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/tags?post=1236"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}