Tolong pilih kategori sesuai, jenis posting (diskusi atau bukan) dan sertakan tag/topik yang sesuai seperti komputer, java, php, mysql, dll. Promosi atau posting tidak pada tempatnya akan kami hapus!
- Bagi Anda yang ingin mendaftar, baca link berikut:
http://diskusiweb.com/discussion/50491/how-to-registrasi-diskusiweb-com-baca-ini-terlebih-dahulu
- Cara menyisipkan kode program supaya tampil rapi dan terformat dengan baik di diskusiweb.com: http://www.diskusiweb.com/discussion/50415/cara-menyisipkan-kode-program-di-diskusiweb-com
- Cara posting gambar/image di post Anda: http://www.diskusiweb.com/discussion/47345/cara-menyisipkan-menyertakan-image-pada-posting/p1

[TUTORIAL] Membuat Dokumen / Laporan PDF, DOC, DOCX, XLS, XLSX, PPT, PPTX dengan PHP dan LibreOffice

Bahasa pemrograman tidak hanya terbatas pada PHP. Dapat menggunakan bahasa pemrograman lain. Dengan syarat bahasa pemrograman tersebut dapat membaca / menulis file dan menjalankan perintah CLI.

LibreOffice Licenses
LibreOffice is Free Software. LibreOffice is made available subject to the terms of the Mozilla Public License v2.0 which is reproduced below. It is based on code from Apache OpenOffice made available under the Apache License 2.0 but also includes software which differs from version to version under a large variety of other Open Source licenses.

https://www.libreoffice.org/about-us/licenses/
Sekiranya LibreOffice bermanfaat, silakan donasi ke : https://www.libreoffice.org/donate/

[SESI 1] Bermain dengan LibreOffice
- [Langkah 1] Download dan install LibreOffice  
- [Langkah 2] Membuat naskah dokumen dan konversi menjadi .FODT  
- [Langkah 3] Konversi file .FODT menjadi .PDF / .DOC / .DOCX melalui Command Line  
- [Langkah 4] Menjalankan / menghapus LibreOffice sebagai service  
- [Langkah 5] Konversi file .FODT menjadi .PDF / .DOC / .DOCX melalui Command Line via LibreOffice service  

[SESI 2] Membuat template dokumen
- [Langkah 1] Membuat template .DOC / .DOCX dan konversi menjadi .FODT  
- [Langkah 2] Editing template .FODT
      - Contoh Bentuk 1 (Tabular Sederhana)  
      - Contoh Bentuk 2 (Tabular Berwarna Ganjil Genap)  
      - Contoh Bentuk 3 (Tabular w/ Header, Footer, Page Numbering, Table Header)  
      - Contoh Bentuk 4 (Tabular, Loop Data Bertingkat)  
      - Contoh Bentuk 5 (Tabular Dengan Data Gambar)
      - Contoh Bentuk 6 (List, List Bertingkat, Chart)
      - Contoh Bentuk 7 (Sejenis Buku Panduan / Brosur / Leaflet)
- [Langkah 3] Mengenal tag dan style .FODT

[SESI 3] PHP script, membuat dokumen menggunakan template .FODT
- [Langkah 1] Script PHP sederhana  
- [Langkah 2] Script PHP template dgn loop data
      - Koding Utk Contoh Bentuk 1  
      - Koding Utk Contoh Bentuk 2  
      - Koding Utk Contoh Bentuk 3  
      - Koding Utk Contoh Bentuk 5
      - Koding Utk Contoh Bentuk 7  
- [Langkah 3] Script PHP template dgn loop data di dalam loop
      - Koding Utk Contoh Bentuk 4  
      - Koding Utk Contoh Bentuk 6

[TAMBAHAN] Catatan pribadi kekurangan dan kelebihan penggunaan LibreOffice dan masalah yg pernah ditemui
Bagian 1, Bagian 2, Bagian 3

[CONTOH] Contoh template, database dan koding PHP
- [1] Laporan Excel (Tabular Sederhana)  
Tiruan laporan contoh 1, hanya diubah menggunakan Excel dari yg sebelumnya menggunakan Word.
- [2] Laporan PowerPoint (Sejenis Buku Panduan / Brosur / Leaflet)
Tiruan laporan contoh 7, hanya diubah menggunakan PowerPoint dari yg sebelumnya menggunakan Word.

Catatan :
- Sepanjang tutorial ini, saya berasumsi menggunakan OS Windows, OS lain silakan menyesuaikan sendiri.
(LibreOffice, MySQL, PHP, Web Server tersedia baik utk Linux, Windows, Mac OS, jadi semuanya bisa menggunakan tutorial ini)

- OS yg saya gunakan adalah Microsoft Windows Server 2008 R2 x64, versi Windows yg lain silakan menyesuaikan sendiri.

- LibreOffice yg dipergunakan adalah LibreOffice 6 x64, dgn letak folder default
C:\Program Files\LibreOffice\
versi LibreOffice lain silakan menyesuaikan nama folder-nya.

- Opsi dan parameter utk LibreOffice biasanya cukup ditulis dgn tanda '-' : soffice.exe -opsi
di OS lain mungkin berbeda, menggunakan '--' : soffice.exe --opsi
silakan baca dokumentasi LibreOffice utk Command Line : https://help.libreoffice.org/Common/Starting_the_Software_With_Parameters

- Penggunaan LibreOffice utk generate dokumen / laporan hanya dimungkinkan jika mesin server dimiliki / dikelola sendiri.

- Untuk pembelajaran / uji coba / presentasi / demo / aplikasi lokal, masih dimungkinkan dipakai di localhost atau di dalam jaringan LAN.

- Versi yg sudah pernah saya pakai utk membuat report / dokumen dan berhasil adalah versi : 4, 5, dan 6.
(Dari pertama pakai cara ini, tahun 2012 / 2013, belum pernah gagal / mengecewakan :D)

- Bahasan utama menggunakan contoh naskah / template PDF / Microsoft Word (DOC / DOCX), naskah / template lain XLS, XLSX, PPT, PPTX hanya akan berupa contoh di akhir tutorial.

- Database tidak hanya terbatas pada menggunakan MySQL, dapat menggunakan database engine lain.

- Web Server tidak hanya terbatas pada menggunakan Apache, dapat menggunakan web server lain.

Tutorial akan dibuat bertahap, tergantung waktu senggang. :p
Jika ingin bertanya (walaupun tutorial belum selesai, diusahakan tetap dijawab), silakan buat thread baru di http://diskusiweb.com/categories/tanya-jawab
Gambar ilustrasi menyusul :D

Sebelum tutorial selesai, thread akan di lock.

▲ Daftar Isi ▲

Comments

  • edited April 30
    [SESI 1] Bermain dengan LibreOffice

    [Langkah 1] Download dan install LibreOffice

    Download dan install terlebih dahulu LibreOffice.
    https://www.libreoffice.org/download/download/

    Download sesuai versi OS dan mesin yg dipakai.
    Mesin x64 tetap bisa memakai LibreOffice x86, biarpun LibreOffice versi x64 juga ada.

    Bisa juga download versi lama.
    https://downloadarchive.documentfoundation.org/LibreOffice/old/

    Setelah proses download selesai, lakukan instalasi.
    Lakukan proses instalasi dgn cara biasa, tidak ada tambahan / pengurangan langkah apapun.

    Siapkan 1 (satu) folder khusus utk menyimpan dokumen / template.
    Anggap folder itu adalah : C:\template\

    Siapkan 1 (satu) folder khusus utk folder pengolahan sementara (temporary folder)
    Anggap folder itu adalah : C:\temp\

    ▲ Daftar Isi ▲
  • edited April 23
    [Langkah 2] Membuat naskah dokumen dan konversi menjadi .FODT

    Langkah awal dicoba bermain dengan naskah dokumen biasa.
    Silakan membuat dokumen apa pun, dengan isi sembarang.
    Gunakan aplikasi word prosesor yg sudah biasa dipakai dan familiar dgn fungsi-fungsinya.

    Jika biasa memakai Microsoft Office, silakan dipergunakan.
    Tapi jika sudah terbiasa memakai LibreOffice, silakan gunakan LibreOffice.
    Atau silakan memakai word prosesor lain, yg penting hasil keluarannya bisa dibuka dgn LibreOffice.

    Saya anggap word prosesor yg dipakai : Microsoft Office
    - Buat naskah bebas
    - Simpan menjadi file .DOC atau .DOCX di folder C:\template\
    - Anggap nama file-nya C:\template\naskah.doc
    - Tutup Microsoft Word

    - Buka LibreOffice Writer
    - Buka file dokumen C:\template\naskah.doc yg sudah disimpan.

    Biasanya ada sedikit perbedaan, tidak 100% sama persis, sepengalaman saya mungkin sekitar 99% sama.
    - Simpan dokumen Microsoft Word yg sudah dibuka menjadi file .FODT
    Isi file .FODT sebenarnya adalah file XML.
    - Anggap file .FODT disimpan menjadi C:\template\naskah.fodt
    - Tutup LibreOffice Writer

    Dari LibreOffice Writer ini sebenarnya dokumen dapat langsung di-export menjadi file PDF,
    tapi bukan itu tujuannya.

    Yang akan dicoba dilakukan adalah mengkonversi file .FODT yg sudah jadi, menjadi file PDF / DOC / DOCX melalui Command Line, karena ini yg nanti akan dipergunakan di PHP.

    Catatan :
    - Untuk file Microsoft Excel (.XLS / .XLSX), buka dengan LibreOffice Calc, simpan menjadi .FODS
    - Untuk file Microsoft PowerPoint (.PPT / .PPTX), buka dengan LibreOffice Impress, simpan menjadi .FODP
    - Proses konversi
    .FODS menjadi .XLS / .XLSX / .PDF
    .FODP menjadi .PPT / .PPTX / .PDF
    mengikuti langkah-langkah selanjutnya hanya dengan mengubah parameter yang disertakan

    ▲ Daftar Isi ▲
  • edited April 23
    [Langkah 3] Konversi file .FODT menjadi .PDF / .DOC / .DOCX melalui Command Line

    - Buka Command Line (bisa lewat shortcut, atau lewat run : cmd).

    - File-file yg sudah tersedia :
    C:\template\naskah.doc (hasil Microsoft Word)
    C:\template\naskah.fodt (hasil konversi LibreOffice Writer)

    - Rename terlebih dahulu C:\template\naskah.doc menjadi nama lain.
    Misal C:\template\naskah-copy.doc

    Konversi FODT -> PDF
    - Ketik dan jalankan perintah di Command Line :
    "C:\Program Files\LibreOffice\program\soffice.exe" -headless -convert-to pdf -outdir "C:\template" "C:\template\naskah.fodt"


    Tunggu beberapa saat ... file C:\template\naskah.pdf sudah berhasil dibuat.

    Konversi menjadi FODT -> DOC (Microsoft Word 97)
    - Ketik dan jalankan perintah di Command Line :
    "C:\Program Files\LibreOffice\program\soffice.exe" -headless -convert-to doc -outdir "C:\template" "C:\template\naskah.fodt"


    Tunggu beberapa saat ... file C:\template\naskah.doc sudah berhasil dibuat.

    Konversi menjadi FODT -> DOCX (Microsoft Word 2007)
    - Ketik dan jalankan perintah di Command Line :
    "C:\Program Files\LibreOffice\program\soffice.exe" -headless -convert-to docx -outdir "C:\template" "C:\template\naskah.fodt"


    Tunggu beberapa saat ... file C:\template\naskah.docx sudah berhasil dibuat.

    Setelah jadi, file-file yg dihasilkan sudah dapat langsung dibuka dan diperiksa bentuk, isi, dan kebenaran tampilannya.

    Catatan :
    Tentang penjelasan parameter :
    -headless
    -convert-to output_file_extension -outdir output_dir input_file
    dapat dibaca di :
    https://help.LibreOffice.org/Common/Starting_the_Software_With_Parameters

    .XLS : -convert-to xls -outdir "C:\template" "C:\template\naskah_excel.fods"
    .XLSX : -convert-to xlsx -outdir "C:\template" "C:\template\naskah_excel.fods"
    .PPT : -convert-to ppt -outdir "C:\template" "C:\template\naskah_powerpoint.fodp"
    .PPTX : -convert-to pptx -outdir "C:\template" "C:\template\naskah_powerpoint.fodp"

    File .FODT, .FODS, .FODP semuanya dapat dikonversi menjadi file .PDF

    Khusus utk .FODS, sebelum dijadikan .PDF, lakukan "Set Print Area" dan atur orientasi dokumen terlebih dahulu saat membuat template awal dgn Microsoft Excel agar hasil PDF sesuai keinginan.

    ▲ Daftar Isi ▲
  • edited April 29
    [Langkah 4] Menjalankan / menghapus LibreOffice sebagai service

    Menjalankan LibreOffice sebagai service
    Langkah ini diperlukan jika konversi / generate dokumen dilakukan secara multitasking,
    artinya banyak user melakuan permintaan dokumen secara bersamaan.


    Jika tidak dijalankan sebagai service, kemungkinan konversi dokumen akan gagal.
    PC / Server akan hang atau tidak dapat melayani permintaan dokumen lebih lanjut.

    - Buka Task Manager, run : taskmgr
    - Urutkan berdasar "Image Name"
    - Cari kumpulan aplikasi yg dimulai dgn huruf "s", pastikan tidak ada soffice.exe & soffice.bin di daftar itu

    - Buka Command Line, run : cmd
    - Utk menjalankan LibreOffice sbg service, ketik dan jalankan perintah :
    "C:\Program Files\LibreOffice\program\soffice.exe" "-accept=socket,host=127.0.0.1,port=8080,tcpNoDelay=1;urp;" -headless -nodefault -nofirststartwizard -nolockcheck -nologo -norestore
    Artinya LibreOffice akan dijalankan sebagai service yg "mendengarkan" permintaan melalui
    host 127.0.0.1 (localhost)
    port 8080

    - Pastikan soffice.exe & soffice.bin sudah terdaftar di Task Manager.

    Menghapus LibreOffice sebagai service
    Jika LibreOffice sudah berjalan sebagai service, maka tidak akan ada LibreOffice lain yg dapat dibuka secara manual.

    Jika ingin membuka LibreOffice seperti biasa, maka LibreOffice harus dihapus terlebih dahulu dari Task Manager.

    [A] Untuk menghapus service LibreOffice, dapat dilakukan "secara paksa" dari Task Manager
    - Pilih "soffice.bin" atau "soffice.exe"
    - Klik kanan
    - Pilih "End Process Tree"

    [B] Atau cukup melakukan proses konversi dokumen dgn perintah semacam :
    "C:\Program Files\LibreOffice\program\soffice.exe" -headless -convert-to pdf -outdir "C:\template" "C:\template\naskah.fodt"

    - Pastikan soffice.exe & soffice.bin sudah terhapus dan tidak terdaftar lagi di Task Manager.

    Jalankan LibreOffice sebagai service hanya di mesin produksi yg menghadapi permintaan dokumen multitasking.

    Untuk mesin yg digunakan untuk pengembangan aplikasi / pembuatan template, sebaiknya tidak dijalankan sebagai service kecuali utk uji coba.

    Karena jika dijalankan sebagai service, maka LibreOffice tidak dapat dibuka misalnya utk membuka file dokumen DOC utk diperiksa layout-nya, diedit dan dikonversi menjadi FODT.

    ▲ Daftar Isi ▲
  • edited April 24
    [Langkah 5] Konversi file .FODT menjadi .PDF / .DOC / .DOCX melalui Command Line via LibreOffice service

    Dikarenakan perintah konversi biasa akan menyebabkan service LibreOffice terhapus,
    maka proses konversi harus dilakukan dgn cara lain.

    - Hapus terlebih dahulu file-file uji coba sebelumnya di folder C:\template\.
    Sisakan hanya file-file :
    C:\template\naskah-copy.doc
    C:\template\naskah.fodt

    - Pastikan di dalam folder LibreOffice sudah terdapat C:\Program Files\LibreOffice\program\python.exe

    - Download unoconv dari https://github.com/dagwieers/unoconv (tidak perlu di download semua)

    - Yg dibutuhkan hanya file https://raw.githubusercontent.com/dagwieers/unoconv/master/unoconv
    - Klik kanan link di atas, pilih "Save Link As...", simpan jadi unoconv (tanpa ekstensi)

    - Jika muncul tambahan ekstensi (biasanya jika disimpan dari browser Chrome), misal .txt, hapus ekstensi tersebut

    - Simpan file unoconv (tanpa ekstensi) di folder C:\Program Files\LibreOffice\program\

    - Pastikan LibreOffice sudah jalan sebagai service


    Jika belum jalan sebagai service, jalankan terlebih dahulu
    "C:\Program Files\LibreOffice\program\soffice.exe" "-accept=socket,host=127.0.0.1,port=8080,tcpNoDelay=1;urp;" -headless -nodefault -nofirststartwizard -nolockcheck -nologo -norestore

    - Buka Command Line, run : cmd

    Konversi FODT -> PDF via LibreOffice service
    - Ketik dan jalankan perintah di Command Line :
    "C:\Program Files\LibreOffice\program\python.exe" "C:\Program Files\LibreOffice\program\unoconv" --connection "socket,host=127.0.0.1,port=8080,tcpNoDelay=1;urp;StarOffice.ComponentContext" -f pdf -o "C:\temp\naskah.pdf" "C:\template\naskah.fodt"
    Parameter host dan port
    "socket,host=127.0.0.1,port=8080,tcpNoDelay=1;urp;StarOffice.ComponentContext"
    disesuaikan dgn host dan port yg digunakan pada saat menjalankan LibreOffice sebagai service
    "-accept=socket,host=127.0.0.1,port=8080,tcpNoDelay=1;urp;"

    - File PDF hasil konversi akan muncul di folder C:\temp\
    sesuai dengan parameter : -o "C:\temp\naskah.pdf"

    - Hasil file PDF sudah bisa dibuka diperiksa kebenarannya

    - Konversi menjadi tipe dokumen lain menyesuaikan parameter yg ada.
    Konversi FODT -> DOC via LibreOffice service
    ... -f doc -o "C:\temp\naskah.doc" "C:\template\naskah.fodt"
    Konversi FODT -> DOCX via LibreOffice service
    ... -f docx7 -o "C:\temp\naskah.docx" "C:\template\naskah.fodt"
    Utk DOCX Microsoft Office 2007 di unoconv, parameter -f yg dipergunakan "docx7", bukan "docx".
    Utk versi unoconv lama, seingat saya "docx".
    Hal ini mungkin dikarenakan munculnya Microsoft Office versi baru yg mempunyai format dokumen baru (Microsoft Office Open XML format) yg juga memakai ekstensi .DOCX.
    Jadi utk format DOCX Microsoft Office 2007 ditambah "7".
    Parameter "docx" tetap dapat dipergunakan, tapi merujuk pada format dokumen Microsoft Office Open XML (mungkin dipergunakan di Microsoft Office 2010 atau yg lebih baru).

    ▲ Daftar Isi ▲
  • edited April 23
    [SESI 2] Membuat template dokumen

    [Langkah 1] Membuat template .DOC / .DOCX dan konversi menjadi .FODT

    Dikarenakan terbatasnya panjang posting yg bisa dilakukan, maka dokumen-dokumen yg panjang akan disertakan sebagai attachment posting.

    Seperti pada [Sesi 1] [Langkah 2] Membuat naskah dokumen dan konversi menjadi .FODT
    Pembuatan template sangat mudah dengan menggunakan Microsoft Word untuk menghasilkan file DOC / DOCX.
    Selanjutnya dengan menggunakan LibreOffice Writer dikonversi menjadi file FODT.
    Bentuk dokumen, layout, format, dan isinya benar-benar bebas.

    Hanya untuk isi dokumen yg akan diganti melalui koding, yg akan dijadikan "variable template", dapat menggunakan data dummy pada saat pembuatan dokumen awal.

    "Variable template" dapat diperkirakan dan direncanakan utk diletakkan di mana pun di dalam bagian dokumen yg mana pun, di halaman berapa pun, dengan format dan bentuk apa pun.

    Silakan rancang dan buat bentuk dan layout sesuai kebutuhan.

    Setelah dokumen FODT jadi, maka dapat mengikuti langkah-langkah berikut agar file FODT tersebut dapat dipergunakan di dalam koding.


    Bentuk paling sederhana dari template FODT

    - Menggunakan file C:\template\naskah.fodt sederhana di contoh awal.
    File terlampir di attachment (terkompres, silakan di-extract terlebih dahulu) :
    http://diskusiweb.com/uploads/editor/0x/5q6s99g7r50f.zip

    - Buka file tersebut menggunakan aplikasi text editor biasa, sejenis Notepad.
    Tidak menyarankan penggunaan Notepad karena fiturnya yg sangat terbatas.
    Gunakan text editor lain yg lengkap fiturnya dan dapat membaca file text UTF-8.
    https://en.wikipedia.org/wiki/List_of_text_editors#Graphical_user_interface

    Tidak menyarankan juga editing secara visual menggunakan Microsoft Word / LibreOffice Writer, karena dapat membuat variable template yg akan dibuat nantinya tidak terbaca karena tercampur dengan tag-tag XML.

    Saya sendiri menggunakan UltraEdit sebagai text editor harian utk koding.
    Untuk selanjutnya, rujukan dan capture gambar menggunakan referensi UltraEdit.

    - Cari text seperti yg tertulis pada bagian awal dari dokumen : Hello World!

    - Maka akan ditemukan bentuk XML seperti berikut
       <text:p text:style-name="P1">Hello World!</text:p>
    <text:p text:style-name="P2">Lorem ipsum dolor sit amet, ...[dipotong]... Aenean nec libero ut tellus faucibus molestie.</text:p>
    <text:p text:style-name="P3">Phasellus pharetra est ipsum, ...[dipotong]... Phasellus non vehicula dui.</text:p>
    <text:p text:style-name="P4">Pellentesque habitant morbi tristique senectus ...[dipotong]... Nullam at dui quis lorem gravida vulputate. Nulla in congue odio.</text:p>
    <text:p text:style-name="P4"/>
    (text panjang dipotong untuk menyederhanakan posting)

    - Untuk membuat template menggunakan file FODT, maka bagian-bagian yang akan diganti melalui script PHP harus diganti dengan suatu identitas yg unik, dalam hal ini saya sebut "variable template"

    - "Variable template" bebas dapat dibuat menurut selera, hanya mensyaratkan identitas tersebut harus :
    • unik, spesifik, gampang diingat,
    • sebisa mungkin mencerminkan isi,
    • tidak mengandung karakter yg umum ada di dalam file XML
      (semisal jangan menggunakan karakter < / > ),
    • bebas menggunakan huruf besar kecil selama bisa dimengerti
    - Contoh "variable template" yg dapat dipergunakan : {nama_var} , {NAMAVAR} , ##nama-var## , dan lainnya

    - Pada contoh dokumen di atas, semisal seluruh text yg ada dapat diganti melalui script PHP akan menjadi
       <text:p text:style-name="P1">{TEXT_JUDUL}</text:p>
    <text:p text:style-name="P2">{TEXT_PERTAMA}</text:p>
    <text:p text:style-name="P3">{TEXT_KEDUA}</text:p>
    <text:p text:style-name="P4">{TEXT_KETIGA}</text:p>
    <text:p text:style-name="P4"/>
    Nantinya, setelah "variable template" diganti dgn isi yg benar melalui koding, maka isi tersebut akan mengikuti letak, bentuk dan format yg telah dibuat seperti yg sudah ditentukan pada saat awal membuat dokumen.

    Jika saat membuat dokumen bagian itu dibuat tebal, maka isinya nanti juga akan tebal, begitu seterusnya.

    - Simpan file FODT tersebut dgn nama lain sehingga file asal tetap dapat digunakan sebagai rujukan pengecekan error jika terjadi kesalahan. Misal disimpan menjadi : C:\template\naskah-template.fodt
    Saat menyimpan file, gunakan encoding UTF-8.
    http://diskusiweb.com/uploads/editor/2c/mrxfy090yinw.zip

    - File template C:\template\naskah-template.fodt sudah siap digunakan di dalam koding PHP

    Contoh penggunaannya pada koding PHP :
    [SESI 3] [Langkah 1] Script PHP sederhana

    Catatan :
    Koding yg digunakan tidak hanya terbatas pada PHP, bisa digunakan juga utk bahasa pemrograman lain.

    Selama bahasa pemrograman itu dapat
    • membaca file,
    • mengganti "variable template" dgn suatu nilai,
    • menyimpan file,
    • dan menjalankan perintah melalui CLI
    maka aplikasi yg dibangun dgn bahasa pemrograman tersebut juga dapat men-generate laporan / dokumen yg sama dengan menggunakan LibreOffice.

    Contoh bahasa pemrograman lain yg dapat digunakan : Delphi, C/C++, C#, VisualBasic, dll.

    ▲ Daftar Isi ▲

  • edited April 29
    Post banyak disingkat karena posting membatasi panjang karakter.
    File contoh selalu disertakan di attachment.

    [Langkah 2] Editing template .FODT

    Berikut akan dicontohkan bentuk-bentuk template yg dapat dibuat.
    Template tidak terbatas dgn bentuk yg dicontohkan, benar-benar bebas, selama dapat dibuat dengan LibreOffice.

    Contoh Bentuk 1 (Tabular Sederhana)
    Bentuk tabular / tabel sederhana.
    Hanya dengan header tabel dan isinya, dengan layout header warna gelap, dan border sederhana.

    File DOCX (list1.docx) & hasil konversi FODT (list1.fodt) :
    http://diskusiweb.com/uploads/editor/ns/lx4xscynxfeg.zip
    (silakan ekstrak ke folder C:\template\)

    Buka file C:\template\list.fodt dgn text editor, maka akan ditemukan perulangan data
    ...
    ...
    <table:table table:name="Table1" table:style-name="Table1">
    <table:table-column table:style-name="Table1.A" table:number-columns-repeated="3"/>
    <table:table-row table:style-name="Table1.1">
    <table:table-cell table:style-name="Table1.A1" office:value-type="string">
    <text:p text:style-name="P2"><text:span text:style-name="T1">Name</text:span></text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.A1" office:value-type="string">
    <text:p text:style-name="P2"><text:span text:style-name="T1">Title</text:span></text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.A1" office:value-type="string">
    <text:p text:style-name="P2"><text:span text:style-name="T1">Department</text:span></text:p>
    </table:table-cell>
    </table:table-row>
    <table:table-row table:style-name="Table1.1">
    <table:table-cell table:style-name="Table1.A2" office:value-type="string">
    <text:p text:style-name="P1">Aaaaa</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.B2" office:value-type="string">
    <text:p text:style-name="P1">Title1</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.C2" office:value-type="string">
    <text:p text:style-name="P1">Dept1</text:p>
    </table:table-cell>
    </table:table-row>
    <table:table-row table:style-name="Table1.1">
    <table:table-cell table:style-name="Table1.A3" office:value-type="string">
    <text:p text:style-name="P1">Bbbbb</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.B3" office:value-type="string">
    <text:p text:style-name="P1">Title2</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.C3" office:value-type="string">
    <text:p text:style-name="P1">Dept2</text:p>
    </table:table-cell>
    </table:table-row>
    <table:table-row table:style-name="Table1.1">
    <table:table-cell table:style-name="Table1.A4" office:value-type="string">
    <text:p text:style-name="P1">Ccccc</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.B4" office:value-type="string">
    <text:p text:style-name="P1">Title3</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.C4" office:value-type="string">
    <text:p text:style-name="P1">Dept3</text:p>
    </table:table-cell>
    </table:table-row>
    <table:table-row table:style-name="Table1.1">
    <table:table-cell table:style-name="Table1.A5" office:value-type="string">
    <text:p text:style-name="P1">Ddddd</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.B5" office:value-type="string">
    <text:p text:style-name="P1">Title4</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.C5" office:value-type="string">
    <text:p text:style-name="P1">Dept4</text:p>
    </table:table-cell>
    </table:table-row>

    </table:table>
    ...
    ...
    Bagian awal dapat dipastikan adalah header tabel yg tidak perlu diubah.
    Bagian berulang adalah bagian data yg dapat dan akan diisi melalui koding.
    Data yg diisikan dari koding dapat berasal dari perhitungan atau data dari database.

    Buka dokumen text baru, kosong.
    Copy bagian perulangan data, lalu salin ke dokumen text kosong tersebut.
    Hapus bagian berulang, sisakan cukup untuk template 1 data.
    Ganti data dengan "variable template" yg sesuai
     <table:table-row table:style-name="Table1.1">
    <table:table-cell table:style-name="Table1.A2" office:value-type="string">
    <text:p text:style-name="P1">{NAME}</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.B2" office:value-type="string">
    <text:p text:style-name="P1">{TITLE}</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.C2" office:value-type="string">
    <text:p text:style-name="P1">{DEPARTMENT}</text:p>
    </table:table-cell>
    </table:table-row>
    Simpan dokumen text ini menjadi file text : C:\template\list1-data.fodt dengan encoding UTF-8, lalu tutup file ini.

    Kembali ke dokumen C:\template\list1.fodt.
    Ganti bagian data berulang yg sudah diambil dgn "variable template" {DATA}
    ...
    ...
    <table:table table:name="Table1" table:style-name="Table1">
    <table:table-column table:style-name="Table1.A" table:number-columns-repeated="3"/>
    <table:table-row table:style-name="Table1.1">
    <table:table-cell table:style-name="Table1.A1" office:value-type="string">
    <text:p text:style-name="P2"><text:span text:style-name="T1">Name</text:span></text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.A1" office:value-type="string">
    <text:p text:style-name="P2"><text:span text:style-name="T1">Title</text:span></text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.A1" office:value-type="string">
    <text:p text:style-name="P2"><text:span text:style-name="T1">Department</text:span></text:p>
    </table:table-cell>
    </table:table-row>
    {DATA}
    </table:table>
    ...
    ...
    Simpan dokumen text ini menjadi file text : C:\template\list1-template.fodt dengan encoding UTF-8, lalu tutup file ini.

    File template pertama sudah siap dipergunakan.
    http://diskusiweb.com/uploads/editor/wm/mbe4wxtip978.zip
    dengan letak dan penamaan file :
    - C:\template\list1-template.fodt
    - C:\template\list1-data.fodt


    Contoh penggunaannya pada koding PHP :
    [SESI 3] [Langkah 2] Script PHP template dgn loop data : Koding Untuk Contoh Bentuk 1

    ▲ Daftar Isi ▲

  • edited April 29
    Post banyak disingkat karena posting membatasi panjang karakter.
    File contoh selalu disertakan di attachment.

    [Langkah 2] Editing template .FODT (lanjutan)

    Contoh Bentuk 2 (Tabular Berwarna Ganjil Genap)
    Masih dgn bentuk tabular / tabel sederhana, tapi dengan layout header berwarna lebih gelap dan pewarnaan baris ganjil-genap yg berbeda.

    File DOCX (list2.docx) & hasil konversi FODT (list2.fodt) :
    http://diskusiweb.com/uploads/editor/ek/a0r3fosejql2.zip
    (silakan ekstrak ke folder C:\template\)

    Buka file C:\template\list2.fodt dgn text editor, maka akan ditemukan perulangan data
    ...
    ...
    <table:table table:name="Table1" table:style-name="Table1">
    <table:table-column table:style-name="Table1.A" table:number-columns-repeated="3"/>
    <table:table-row table:style-name="Table1.1">
    <table:table-cell table:style-name="Table1.A1" office:value-type="string">
    <text:p text:style-name="P1"><text:span text:style-name="T1">Name</text:span></text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.A1" office:value-type="string">
    <text:p text:style-name="P1"><text:span text:style-name="T1">Title</text:span></text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.A1" office:value-type="string">
    <text:p text:style-name="P1"><text:span text:style-name="T1">Department</text:span></text:p>
    </table:table-cell>
    </table:table-row>
    <table:table-row table:style-name="Table1.1">
    <table:table-cell table:style-name="Table1.A2" office:value-type="string">
    <text:p text:style-name="P3">Aaaaa</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.B2" office:value-type="string">
    <text:p text:style-name="P4">Title1</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.C2" office:value-type="string">
    <text:p text:style-name="P4">Dept1</text:p>
    </table:table-cell>
    </table:table-row>
    <table:table-row table:style-name="Table1.1">
    <table:table-cell table:style-name="Table1.A3" office:value-type="string">
    <text:p text:style-name="P3">Bbbbb</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.B3" office:value-type="string">
    <text:p text:style-name="P4">Title2</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.C3" office:value-type="string">
    <text:p text:style-name="P4">Dept2</text:p>
    </table:table-cell>
    </table:table-row>
    <table:table-row table:style-name="Table1.1">
    <table:table-cell table:style-name="Table1.A2" office:value-type="string">
    <text:p text:style-name="P3">Ccccc</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.B2" office:value-type="string">
    <text:p text:style-name="P4">Title3</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.C2" office:value-type="string">
    <text:p text:style-name="P4">Dept3</text:p>
    </table:table-cell>
    </table:table-row>
    <table:table-row table:style-name="Table1.1">
    <table:table-cell table:style-name="Table1.A5" office:value-type="string">
    <text:p text:style-name="P3">Ddddd</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.B5" office:value-type="string">
    <text:p text:style-name="P4">Title4</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.C5" office:value-type="string">
    <text:p text:style-name="P4">Dept4</text:p>
    </table:table-cell>
    </table:table-row>

    </table:table>
    ...
    ...
    Bagian awal dapat adalah header tabel yg tidak perlu diubah.
    Bagian berulang terbagi menjadi 2, baris GANJIL (1,3,...) dan baris GENAP (2,4,...).

    Buka 2 (dua) dokumen text baru, kosong.
    Copy bagian perulangan data, lalu salin ke tiap-tiap dokumen text kosong tersebut.

    Pada dokumen text baru pertama, sisakan hanya baris pertama, ganti data dengan "variable template" yg sesuai
     <table:table-row table:style-name="Table1.1">
    <table:table-cell table:style-name="Table1.A2" office:value-type="string">
    <text:p text:style-name="P3">{NAME}</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.B2" office:value-type="string">
    <text:p text:style-name="P4">{TITLE}</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.C2" office:value-type="string">
    <text:p text:style-name="P4">{DEPARTMENT}</text:p>
    </table:table-cell>
    </table:table-row>
    Simpan dokumen text ini menjadi file text : C:\template\list2-data-ganjil.fodt dengan encoding UTF-8, lalu tutup file ini.

    Pada dokumen text baru kedua, sisakan hanya baris kedua, ganti data dengan "variable template" yg sesuai
     <table:table-row table:style-name="Table1.1">
    <table:table-cell table:style-name="Table1.A3" office:value-type="string">
    <text:p text:style-name="P3">{NAME}</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.B3" office:value-type="string">
    <text:p text:style-name="P4">{TITLE}</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.C3" office:value-type="string">
    <text:p text:style-name="P4">{DEPARTMENT}</text:p>
    </table:table-cell>
    </table:table-row>
    Simpan dokumen text ini menjadi file text : C:\template\list2-data-genap.fodt dengan encoding UTF-8, lalu tutup file ini.

    Kembali ke dokumen C:\template\list1.fodt.
    Ganti bagian data berulang yg sudah diambil dgn "variable template" {DATA}
    ...
    ...
    <table:table table:name="Table1" table:style-name="Table1">
    <table:table-column table:style-name="Table1.A" table:number-columns-repeated="3"/>
    <table:table-row table:style-name="Table1.1">
    <table:table-cell table:style-name="Table1.A1" office:value-type="string">
    <text:p text:style-name="P1"><text:span text:style-name="T1">Name</text:span></text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.A1" office:value-type="string">
    <text:p text:style-name="P1"><text:span text:style-name="T1">Title</text:span></text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table1.A1" office:value-type="string">
    <text:p text:style-name="P1"><text:span text:style-name="T1">Department</text:span></text:p>
    </table:table-cell>
    </table:table-row>
    {DATA}
    </table:table>
    ...
    ...
    Simpan dokumen text ini menjadi file text : C:\template\list2-template.fodt dengan encoding UTF-8, lalu tutup file ini.

    File template kedua sudah siap dipergunakan.
    http://diskusiweb.com/uploads/editor/b6/3496di4kdq8p.zip
    dengan letak dan penamaan file :
    - C:\template\list2-template.fodt
    - C:\template\list2-data-ganjil.fodt
    - C:\template\list2-data-genap.fodt


    Contoh penggunaannya pada koding PHP :
    [SESI 3] [Langkah 2] Script PHP template dgn loop data : Koding Untuk Contoh Bentuk 2

    ▲ Daftar Isi ▲

  • edited April 29
    Post banyak disingkat karena posting membatasi panjang karakter.
    File contoh selalu disertakan di attachment.

    [Langkah 2] Editing template .FODT (lanjutan)

    Contoh Bentuk 3 (Tabular w/ Header, Footer, Page Numbering, Table Header)

    Dengan bentuk tabular / tabel lebih kompleks.
    Terdapat :
    - Header / kop dokumen pada halaman pertama
    - Header / footer tiap halaman
    - Page numbering di footer
    - Gambar logo
    - Header / judul tabel yg berulang jika melewati halaman
    - Border tabel sederhana

    File DOCX (list3.docx) & hasil konversi FODT (list3.fodt) :
    http://diskusiweb.com/uploads/editor/kx/cg1h8qy86e4x.zip
    (silakan ekstrak ke folder C:\template\)

    Buka file C:\template\list3.fodt dgn text editor.
    Langsung simpan menjadi C:\template\list3-template.fodt dgn encoding UTF-8 utk menghindari kesalahan editing menimpa file asli.

    Pertama ubah bagian header / kop dokumen.
    Cari string "Release Date", ubah menjadi "variable template" :
    ...
    ...
    <text:p text:style-name="P4"/>
    <text:p text:style-name="P5"><text:span text:style-name="T3">Release Date<text:tab/>: <text:s/>{DATE}</text:span></text:p>
    <text:p text:style-name="P5"><text:span text:style-name="T3">To<text:tab/><text:tab/>: <text:s/>{TO}</text:span></text:p>
    <text:p text:style-name="P5"><text:span text:style-name="T3">From<text:tab/><text:tab/>: <text:s/>{FROM}</text:span></text:p>
    <text:p text:style-name="P8"/>
    ...
    ...

    Bagian data, cari string "Aaaaa", data pertama dari template yg dibuat.
    Ambil 1 baris data, copy-paste ke dokumen text baru, ubah jadi "variable template" :
        <table:table-row table:style-name="Table5.1">
    <table:table-cell table:style-name="Table5.A1" office:value-type="string">
    <text:p text:style-name="P6"><text:span text:style-name="T4">{NO}</text:span></text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table5.A1" office:value-type="string">
    <text:p text:style-name="P6"><text:span text:style-name="T4">{EMP_NO}</text:span></text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table5.A1" office:value-type="string">
    <text:p text:style-name="P5"><text:span text:style-name="T4">{EMP_LASTNAME}</text:span></text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table5.A1" office:value-type="string">
    <text:p text:style-name="P5"><text:span text:style-name="T4">{EMP_FIRSTNAME}</text:span></text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table5.A1" office:value-type="string">
    <text:p text:style-name="P5"><text:span text:style-name="T4">{EMP_TITLE}</text:span></text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table5.A1" office:value-type="string">
    <text:p text:style-name="P5"><text:span text:style-name="T4">{EMP_DEPARTMENT}</text:span></text:p>
    </table:table-cell>
    </table:table-row>
    Simpan dokumen text baru ini menjadi C:\template\list3-data.fodt , dengan encoding UTF-8.

    Kembali ke C:\template\list3-template.fodt, hapus data berulang, ganti dgn "variable template" {DATA}
    ...
    ...
    <table:table table:name="Table5" table:style-name="Table5">
    <table:table-column table:style-name="Table5.A"/>
    <table:table-column table:style-name="Table5.B"/>
    <table:table-column table:style-name="Table5.C"/>
    <table:table-column table:style-name="Table5.D"/>
    <table:table-column table:style-name="Table5.E"/>
    <table:table-column table:style-name="Table5.F"/>
    <table:table-header-rows>
    <table:table-row table:style-name="Table5.1">
    <table:table-cell table:style-name="Table5.A1" table:number-columns-spanned="2" office:value-type="string">
    <text:p text:style-name="P6"><text:span text:style-name="T5">List of Employees</text:span></text:p>
    </table:table-cell>
    <table:covered-table-cell/>
    <table:table-cell table:style-name="Table5.C1" table:number-columns-spanned="4" office:value-type="string">
    <text:p text:style-name="P9"/>
    </table:table-cell>
    <table:covered-table-cell/>
    <table:covered-table-cell/>
    <table:covered-table-cell/>
    </table:table-row>
    <table:table-row table:style-name="Table5.1">
    <table:table-cell table:style-name="Table5.A1" office:value-type="string">
    <text:p text:style-name="P6"><text:span text:style-name="T3">No.</text:span></text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table5.A1" office:value-type="string">
    <text:p text:style-name="P6"><text:span text:style-name="T3">Employee No.</text:span></text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table5.A1" office:value-type="string">
    <text:p text:style-name="P6"><text:span text:style-name="T3">Last Name</text:span></text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table5.A1" office:value-type="string">
    <text:p text:style-name="P6"><text:span text:style-name="T3">First Name</text:span></text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table5.A1" office:value-type="string">
    <text:p text:style-name="P6"><text:span text:style-name="T3">Title</text:span></text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table5.A1" office:value-type="string">
    <text:p text:style-name="P6"><text:span text:style-name="T3">Department</text:span></text:p>
    </table:table-cell>
    </table:table-row>
    </table:table-header-rows>
    {DATA}
    </table:table>
    <text:p text:style-name="P5"/>
    </office:text>
    </office:body>
    </office:document>

    File template ketiga sudah siap dipergunakan.
    http://diskusiweb.com/uploads/editor/g6/1s9j18j3wkc4.zip
    dengan letak dan penamaan file :
    - C:\template\list3-template.fodt
    - C:\template\list3-data.fodt


    Contoh penggunaannya pada koding PHP :
    [SESI 3] [Langkah 2] Script PHP template dgn loop data : Koding Untuk Contoh Bentuk 3

    ▲ Daftar Isi ▲

  • edited April 29
    Post banyak disingkat karena posting membatasi panjang karakter.
    File contoh selalu disertakan di attachment.

    [Langkah 2] Editing template .FODT (lanjutan)

    Contoh Bentuk 4 (Tabular, Loop Data Bertingkat)
    Turunan dari bentuk 3, dengan bbrp tambahan :
    - Tabel berulang per bagian
    - Border tabel lebih kompleks (outline tebal, inline tipis)

    File DOCX (list4.docx) & hasil konversi FODT (list4.fodt) :
    http://diskusiweb.com/uploads/editor/ee/7gys8i2o6rvc.zip
    (silakan ekstrak ke folder C:\template\)

    Buka C:\template\list4.fodt dgn text editor.
    Simpan menjadi C:\template\list4-template.fodt dgn encoding UTF-8 utk menghindari kesalahan editing menimpa file asli.

    Perlu diingat, perulangan pada template ini adalah 1 tabel penuh.
    Cari "Aaaaa", dan cari tag "<table:table table:name" sebelum posisi "Aaaaa" yg ditemukan.
    Ambil 1 blok tabel, copy-paste ke dokumen text baru. Pisahkan juga perulangan data ke dokumen text baru lainnya. Ganti dengan "variable template" :
       <table:table table:name="Table2" table:style-name="Table2">
    <table:table-column table:style-name="Table2.A"/>
    <table:table-column table:style-name="Table2.B"/>
    <table:table-column table:style-name="Table2.C"/>
    <table:table-column table:style-name="Table2.D"/>
    <table:table-column table:style-name="Table2.E"/>
    <table:table-header-rows>
    <table:table-row table:style-name="Table2.1">
    <table:table-cell table:style-name="Table2.A1" table:number-columns-spanned="2" office:value-type="string">
    <text:p text:style-name="P6"><text:span text:style-name="T5">List of Employees</text:span></text:p>
    </table:table-cell>
    <table:covered-table-cell/>
    <table:table-cell table:style-name="Table2.C1" office:value-type="string">
    <text:p text:style-name="P10"/>
    </table:table-cell>
    <table:table-cell table:style-name="Table2.A1" table:number-columns-spanned="2" office:value-type="string">
    <text:p text:style-name="P5"><text:span text:style-name="T3">Department {DEPARTMENT}</text:span></text:p>
    </table:table-cell>
    <table:covered-table-cell/>
    </table:table-row>
    <table:table-row table:style-name="Table2.1">
    <table:table-cell table:style-name="Table2.A2" office:value-type="string">
    <text:p text:style-name="P6"><text:span text:style-name="T3">No.</text:span></text:p>
    </table:table-cell>
    ...
    ...
    <table:table-cell table:style-name="Table2.E2" office:value-type="string">
    <text:p text:style-name="P6"><text:span text:style-name="T3">Title</text:span></text:p>
    </table:table-cell>
    </table:table-row>
    </table:table-header-rows>
    {DATA}
    <table:table-row table:style-name="Table2.1">
    <table:table-cell table:style-name="Table2.A19" office:value-type="string">
    <text:p text:style-name="P9"/>
    </table:table-cell>
    <table:table-cell table:style-name="Table2.A19" office:value-type="string">
    <text:p text:style-name="P9"/>
    </table:table-cell>
    <table:table-cell table:style-name="Table2.C19" office:value-type="string">
    <text:p text:style-name="P8"/>
    </table:table-cell>
    <table:table-cell table:style-name="Table2.D19" office:value-type="string">
    <text:p text:style-name="P5">
    <text:span text:style-name="T4">Male Worker
    <text:line-break/>Female Worker<text:line-break/>
    <text:line-break/>Assistant Level
    <text:line-break/>Regular Level
    <text:line-break/>Senior Level
    <text:line-break/>Leader Level</text:span>
    </text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table2.E19" office:value-type="string">
    <text:p text:style-name="P5">
    <text:span text:style-name="T4">{NUM_MALE} Peoples
    <text:line-break/>{NUM_FEMALE} Peoples<text:line-break/>
    <text:line-break/>{NUM_ASSISTANT} Peoples
    <text:line-break/>{NUM_REGULAR} Peoples
    <text:line-break/>{NUM_SENIOR} Peoples
    <text:line-break/>{NUM_LEADER} Peoples</text:span>
    </text:p>
    </table:table-cell>
    </table:table-row>
    </table:table>
    <text:p text:style-name="P8"/>
    Simpan dokumen text baru ini menjadi C:\template\list4-table.fodt , dengan encoding UTF-8.
    Ada perapian tag XML yg ada, pada saat generate FODT pada bagian kotak jumlah ada perbedaan tag-tag XML antara judul baris dan jumlahnya. Dirapikan mengikuti bentuk tag XML judul barisnya.

    Untuk data, ambil 1 baris data, ganti dgn "variable template" :
        <table:table-row table:style-name="Table2.1">
    <table:table-cell table:style-name="Table2.A4" office:value-type="string">
    <text:p text:style-name="P6"><text:span text:style-name="T4">{NO}</text:span></text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table2.B4" office:value-type="string">
    <text:p text:style-name="P6"><text:span text:style-name="T4">{EMP_NO}</text:span></text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table2.B4" office:value-type="string">
    <text:p text:style-name="P5"><text:span text:style-name="T4">{EMP_LASTNAME}</text:span></text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table2.B4" office:value-type="string">
    <text:p text:style-name="P5"><text:span text:style-name="T4">{EMP_FIRSTNAME}</text:span></text:p>
    </table:table-cell>
    <table:table-cell table:style-name="Table2.E4" office:value-type="string">
    <text:p text:style-name="P5"><text:span text:style-name="T4">{EMP_TITLE}</text:span></text:p>
    </table:table-cell>
    </table:table-row>
    Simpan jadi C:\template\list4-data.fodt dgn encoding UTF-8.

    Kembali ke C:\template\list4-template.fodt.
    Cari "Release Date", ubah jadi "variable template".
    Bagian perulangan tabel juga diganti menjadi {TABLE} :
    ...
    <text:p text:style-name="P4"/>
    <text:p text:style-name="P5"><text:span text:style-name="T3">Release Date<text:tab/>: <text:s/>{DATE}</text:span></text:p>
    <text:p text:style-name="P5"><text:span text:style-name="T3">To<text:tab/><text:tab/>: <text:s/>{TO}</text:span></text:p>
    <text:p text:style-name="P5"><text:span text:style-name="T3">From<text:tab/><text:tab/>: <text:s/>{FROM}</text:span></text:p>
    <text:p text:style-name="P8"/>
    {TABLE}
    </office:text>
    </office:body>
    </office:document>


    File template keempat sudah siap dipergunakan.
    http://diskusiweb.com/uploads/editor/7k/4ymf3cxp9hwx.zip
    dengan letak dan penamaan file :
    - C:\template\list4-template.fodt
    - C:\template\list4-table.fodt
    - C:\template\list4-data.fodt


    Contoh penggunaannya pada koding PHP :
    [SESI 3] [Langkah 3] Script PHP template dgn loop data di dalam loop : Koding Untuk Contoh Bentuk 4

    ▲ Daftar Isi ▲

  • edited April 29
    [Langkah 2] Editing template .FODT (lanjutan)

    Contoh Bentuk 5 (Tabular Dengan Data Gambar)

    Table dengan ada bagian data yang berisi gambar.

    File DOCX (list5.docx) & hasil konversi FODT (list5.fodt) :
    http://diskusiweb.com/uploads/editor/mr/u2re1qb2g7vq.zip
    (silakan ekstrak ke folder C:\template\)

    Contoh penggunaannya pada koding PHP :
    [SESI 3] [Langkah 2] Script PHP template dgn loop data : Koding Untuk Contoh Bentuk 5

    ▲ Daftar Isi ▲

  • edited April 29
    [Langkah 2] Editing template .FODT (lanjutan)

    Contoh Bentuk 6 (List, List Bertingkat, Chart)
    Contoh template dokumen dengan list dan grafik.

    File DOCX (naskah2.docx) & hasil konversi FODT (naskah2.fodt) :
    http://diskusiweb.com/uploads/editor/9k/igr8yzpl0oba.zip
    (silakan ekstrak ke folder C:\template\)

    Contoh penggunaannya pada koding PHP :
    [SESI 3] [Langkah 2] Script PHP template dgn loop data di dalam loop : Koding Untuk Contoh Bentuk 6

    ▲ Daftar Isi ▲

  • edited April 29
    [Langkah 2] Editing template .FODT (lanjutan)

    Contoh Bentuk 7 (Sejenis Buku Panduan / Brosur / Leaflet)
    Contoh template dokumen dengan bentuk :
    - Perulangan per halaman
    - Ada tabel
    - Header / footer halaman
    - Logo header dan footer page numbering
    - Jumlah gambar lebih dari 1 per halaman

    File DOCX (candi.docx) & hasil konversi FODT (candi.fodt) :
    http://diskusiweb.com/uploads/editor/hl/49bq436wmu8e.zip
    (silakan ekstrak ke folder C:\template\)

    Contoh penggunaannya pada koding PHP :
    [SESI 3] [Langkah 2] Script PHP template dgn loop data : Koding Untuk Contoh Bentuk 7

    ▲ Daftar Isi ▲

  • edited April 24
    [Langkah 3] Mengenal tag dan style .FODT

    ▲ Daftar Isi ▲
  • edited April 24
    [Langkah 3] Mengenal tag dan style .FODT (lanjutan)

    ▲ Daftar Isi ▲
  • edited April 24
    [Langkah 3] Mengenal tag dan style .FODT (lanjutan)

    ▲ Daftar Isi ▲
  • edited May 1
    [SESI 3] PHP script, membuat dokumen menggunakan template .FODT

    [Langkah 1] Script PHP sederhana

    Dengan menggunakan template yg sudah dibuat pada bagian :
    [SESI 2] [Langkah 1] Membuat template .DOC / .DOCX dan konversi menjadi .FODT

    Resource yg sudah dimiliki :
    - File template C:\template\naskah-template.fodt
    - Temporary folder C:\temp\
    - LibreOffice sudah dijalankan sebagai service
    - Perintah CLI konversi dokumen via LibreOffice service

    "Variable template" yg ada :
    {TEXT_JUDUL}
    {TEXT_PERTAMA}
    {TEXT_KEDUA}
    {TEXT_KETIGA}

    Koding PHP yg dibuat sangat sederhana, dan sangat umum. Sebagian besar hanya memanfaatkan proses penggantian string dgn string lainnya, seperti penggunaan fungsi str_replace().

    Berikut adalah koding PHP dgn bentuk yg diusahakan bagian-bagiannya dapat dipakai di contoh-contoh berikutnya.

    Kode PHP
    <?php

    // periksa query string, download bisa menjadi PDF / DOC / DOCX tergantung isi query string
    // default download sebagai file PDF
    // ... script.php?doc => hasil download file DOC
    if(trim(strtolower($_SERVER['QUERY_STRING']))=='doc') {
    $EXTENSION='doc';
    $CONTENT_TYPE='application/vnd.ms-word';
    $CONVERT_TO='doc';
    }
    // ... script.php?docx => hasil download file DOCX
    else if(trim(strtolower($_SERVER['QUERY_STRING']))=='docx') {
    $EXTENSION='docx';
    $CONTENT_TYPE='application/msword';
    $CONVERT_TO='docx7';
    }
    // ... script.php?pdf => hasil download file PDF
    else {
    $EXTENSION='pdf';
    $CONTENT_TYPE='application/pdf';
    $CONVERT_TO='pdf';
    }

    // tag FODT yg kadang dibutuhkan
    $NEWLINE='<text:line-break/>';
    $PAGEBREAK='<text:soft-page-break/>';

    $host_libreoffice='127.0.0.1'; // setting host service libreoffice
    $port_libreoffice='8080'; // setting port service libreoffice

    $template='C:/template/'; // folder template
    $temp='C:/temp/'; // folder temporary

    // phyton & unoconv
    $unoconv=
    '"C:/Program Files/LibreOffice/program/python.exe" "C:/Program Files/LibreOffice/program/unoconv" '.
    '--connection "socket,host='.$host_libreoffice.',port='.$port_libreoffice.',tcpNoDelay=1;urp;StarOffice.ComponentContext" ';

    // datetime & random stamp, menghindari tercipta nama file yg sama
    $report_time=date('_Ymd_His').sprintf('_%06d',mt_rand(0,999999));

    // nama file output / hasil
    $report_name='naskah';

    // inisialisasi $DOC, penampung utama dokumen
    $DOC='';

    // ambil isi file template
    $template_doc=file_get_contents($template.'naskah-template.fodt');

    // variable template
    $var_doc=array(
    '{TEXT_JUDUL}',
    '{TEXT_PERTAMA}',
    '{TEXT_KEDUA}',
    '{TEXT_KETIGA}'
    );

    // isi dokumen
    $value_doc=array(

    'Hi Meat!',

    'Hamburger pancetta landjaeger, alcatra meatball jowl pork t-bone drumstick bresaola cupim. Leberkas hamburger tenderloin, andouille cow buffalo tongue doner boudin capicola pork loin jerky. Leberkas chuck ham flank short ribs. Capicola biltong turkey short loin prosciutto brisket corned beef shankle t-bone frankfurter tenderloin flank.',

    'Pancetta bresaola meatball, venison leberkas turducken filet mignon doner jerky tenderloin ground round prosciutto ham ham hock sirloin. Fatback andouille rump ball tip shoulder chicken swine cow t-bone turkey meatloaf kielbasa landjaeger. Pork belly doner bresaola short ribs bacon landjaeger chicken, cow t-bone spare ribs picanha.',

    'Tri-tip turducken ball tip kevin pig, leberkas shankle bacon hamburger fatback brisket. Leberkas pig salami pastrami, capicola shankle sirloin bacon beef short ribs hamburger bresaola. Ball tip turkey turducken drumstick, shoulder porchetta burgdoggen doner pork chop picanha pig hamburger t-bone.'

    );

    // proses template, isi dgn value yg benar
    $DOC=str_replace($var_doc,$value_doc,$template_doc);

    // simpan di folder temporary agar tidak "mengotori" folder template
    // dgn nama file $report_name
    // + timestamp & random $report_time agar nama file tidak kembar
    file_put_contents($temp.$report_name.$report_time.'.fodt',$DOC);

    // konversi menjadi jenis dokumen yg dikehendaki dari file hasil proses template
    exec(
    $unoconv.
    '-f '.$CONVERT_TO.' '.
    '-o "'.$temp.$report_name.$report_time.'.'.$EXTENSION.'" '.
    '"'.$temp.$report_name.$report_time.'.fodt"'
    );

    // hapus file temporary
    // utk proses debug kesalahan, perintah ini dapat di-remark agar hasil file temporary bisa diperiksa isinya
    unlink($temp.$report_name.$report_time.'.fodt');

    // download / buka dokumen yg dikehendaki
    header('Expires: Tue, 1 Jan 1980 00:00:00 GMT');
    header('Cache-Control: no-cache');
    header('Pragma: no-cache');
    header('Content-Disposition: attachment; filename="'.$report_name.$report_time.'.'.$EXTENSION.'"');
    header('Content-Type: '.$CONTENT_TYPE);
    readfile($temp.$report_name.$report_time.'.'.$EXTENSION);

    // hapus file hasil
    // utk proses debug kesalahan, perintah ini dapat di-remark agar hasil file terakhir bisa diperiksa isinya
    unlink($temp.$report_name.$report_time.'.'.$EXTENSION);

    ?>
    Koding masih cukup mudah.
    Bagian awal hanya pendefinisian varible-variable yg dianggap perlu.
    Sengaja dipisah utk penggunaan ulang dikoding yg lain (copy-paste).

    Bagian proses hanya sekedar proses penggantian string biasa.
    str_replace( $variabel , $isi , $template );

    Dilanjutkan dgn proses konversi melalui perintah CLI yg sudah dibahas di awal.
    exec( $perintah_cli );

    Bagian akhir juga bentuk standar utk proses download dgn penggunaan header().

    Cara pemanggilan script sudah disertakan parameter utk membuat dokumen menjadi PDF / DOC / DOCX.
    Misal koding disimpan menjadi : php_contoh1.php
    http://localhost/php_contoh1.php?doc ... akan menghasilkan file DOC
    http://localhost/php_contoh1.php?docx ... akan menghasilkan file DOCX

    http://localhost/php_contoh1.php?pdf ... atau hanya ...
    http://localhost/php_contoh1.php ... akan menghasilkan file PDF

    Dari dokumen template awal
    Diubah menjadi template FODT
    Dan setelah diproses di dalam koding, sudah siap menjadi dokumen yg dikehendaki, misal file DOC

    Koding PHP sudah tidak perlu lagi direpotkan utk membentuk layout dokumen satu per satu seperti pada saat menggunakan librari FPDF / TCPDF / HTML2PDF / MPDF atau yg lainnya saat ingin membuat file PDF.



    Kembali ke : [SESI 2] [Langkah 1] Membuat template .DOC / .DOCX dan konversi menjadi .FODT
    ▲ Daftar Isi ▲
  • edited April 29
    [Langkah 2] Script PHP template dgn loop data

    Untuk contoh-contoh selanjutnya, dibutuhkan data dari database.
    Sebagai contoh data akan digunakan data dummy "employees".

    Database engine yg digunakan : MySQL
    Database : employees (silakan diganti jika perlu)

    Dummy data bisa di download dan di restore ke MySQL yg dipergunakan :
    http://diskusiweb.com/uploads/editor/5q/4ra9lsannl4o.zip

    Koding Untuk Contoh Bentuk 1

    Dengan menggunakan template yg sudah dibuat pada bagian :
    [SESI 2] [Langkah 2] Editing template .FODT : Contoh Bentuk 1 (Tabular Sederhana)

    Resource yg sudah dimiliki :
    - File template
    C:\template\list1-template.fodt
    C:\template\list1-data.fodt
    - Temporary folder C:\temp\
    - LibreOffice sudah dijalankan sebagai service
    - Perintah CLI konversi dokumen via LibreOffice service
    - Database employees

    "Variable template" yg ada :
    list1-template.fodt :
    {DATA}
    list1-data.fodt :
    {NAME}
    {TITLE}
    {DEPARTMENT}

    Seperti contoh sebelumnya, beberapa bagian hanya di copy-paste dan diringkas.
    Kode PHP
    <?php

    // set waktu eksekusi tanpa batas waktu, utk dokumen besar
    set_time_limit(0);

    if(trim(strtolower($_SERVER['QUERY_STRING']))=='doc') {$EXTENSION='doc';$CONTENT_TYPE='application/vnd.ms-word';$CONVERT_TO='doc';}
    else if(trim(strtolower($_SERVER['QUERY_STRING']))=='docx') {$EXTENSION='docx';$CONTENT_TYPE='application/msword';$CONVERT_TO='docx7';}
    else {$EXTENSION='pdf';$CONTENT_TYPE='application/pdf';$CONVERT_TO='pdf';}

    $NEWLINE='<text:line-break/>';
    $PAGEBREAK='<text:soft-page-break/>';

    $host_libreoffice='127.0.0.1';
    $port_libreoffice='8080';

    $db=mysqli_connect('localhost','root','','employees') or die(mysqli_connect_errno().': '.mysqli_connect_error());

    $template='C:/template/';
    $temp='C:/temp/';

    $unoconv=
    '"C:/Program Files/LibreOffice/program/python.exe" "C:/Program Files/LibreOffice/program/unoconv" '.
    '--connection "socket,host='.$host_libreoffice.',port='.$port_libreoffice.',tcpNoDelay=1;urp;StarOffice.ComponentContext" ';

    $report_time=date('_Ymd_His').sprintf('_%06d',mt_rand(0,999999));

    // nama file output / hasil
    $report_name='list1';

    // ambil isi file template
    $template_doc=file_get_contents($template.'list1-template.fodt');
    $template_data=file_get_contents($template.'list1-data.fodt');

    // variable template
    $var_doc='{DATA}';
    $var_data=array('{NAME}','{TITLE}','{DEPARTMENT}');

    $qry=mysqli_query($db,
    'SELECT
    CONCAT(e.last_name,", ",e.first_name) AS `name`,
    GROUP_CONCAT(t.title ORDER BY t.from_date DESC SEPARATOR ",") AS `title`,
    GROUP_CONCAT(d.dept_name ORDER BY de.from_date DESC SEPARATOR ",") AS `dept_name`
    FROM employees e
    LEFT JOIN titles t ON t.emp_no=e.emp_no
    LEFT JOIN dept_emp de ON de.emp_no=e.emp_no
    LEFT JOIN departments d ON d.dept_no=de.dept_no
    GROUP BY `name` ASC'
    ) or die(mysqli_errno($db).': '.mysqli_error($db));

    $DOC='';
    $value_doc='';

    while($rec=(mysqli_fetch_assoc($qry))) {
    $rec['title']=explode(',',$rec['title']);$rec['title']=$rec['title'][0];
    $rec['dept_name']=explode(',',$rec['dept_name']);$rec['dept_name']=$rec['dept_name'][0];

    $value_doc.=str_replace($var_data,array($rec['name'],$rec['title'],$rec['dept_name']),$template_data);
    }

    $DOC=str_replace($var_doc,$value_doc,$template_doc);
    file_put_contents($temp.$report_name.$report_time.'.fodt',$DOC);

    exec(
    $unoconv.
    '-f '.$CONVERT_TO.' '.
    '-o "'.$temp.$report_name.$report_time.'.'.$EXTENSION.'" '.
    '"'.$temp.$report_name.$report_time.'.fodt"'
    );

    unlink($temp.$report_name.$report_time.'.fodt');

    header('Expires: Tue, 1 Jan 1980 00:00:00 GMT');
    header('Cache-Control: no-cache');
    header('Pragma: no-cache');
    header('Content-Disposition: attachment; filename="'.$report_name.$report_time.'.'.$EXTENSION.'"');
    header('Content-Type: '.$CONTENT_TYPE);
    readfile($temp.$report_name.$report_time.'.'.$EXTENSION);

    unlink($temp.$report_name.$report_time.'.'.$EXTENSION);

    ?>
    Penambahan set_time_limit(0); hanya jika script harus mengolah dokumen yg besar.
    Pada contoh ini sebenarnya tidak diperlukan karena dokumen hanya kecil ukurannya.
    Tapi tetap ditulis utk membuat kerangka koding yg tetap.
    Di koding sebelumnya tidak ditulis karena proses pengolahan sangat sederhana, hanya contoh string yg tetap, tanpa database sama sekali.

    Cara pemanggilan script sama seperti koding sebelumnya, dapat disertakan parameter ?doc / ?docx / ?pdf sesuai dokumen yg dibutuhkan.
    Misal koding disimpan menjadi : php_contoh2.php
    http://localhost/php_contoh2.php?doc ... akan menghasilkan file DOC

    Dari dokumen template awal
    Setelah diproses di dalam koding, sudah siap menjadi dokumen yg dikehendaki, misal file DOCX



    Kembali ke : [SESI 2] [Langkah 2] Editing template .FODT : Contoh Bentuk 1 (Tabular Sederhana)
    ▲ Daftar Isi ▲

  • edited April 29
    [Langkah 2] Script PHP template dgn loop data (lanjutan)

    Koding Untuk Contoh Bentuk 2

    Dengan menggunakan template yg sudah dibuat pada bagian :
    [SESI 2] [Langkah 2] Editing template .FODT : Contoh Bentuk 2 (Tabular Berwarna Ganjil Genap)

    Resource yg sudah dimiliki :
    - File template
    C:\template\list2-template.fodt
    C:\template\list2-data-ganjil.fodt
    C:\template\list2-data-genap.fodt
    - Temporary folder C:\temp\
    - LibreOffice sudah dijalankan sebagai service
    - Perintah CLI konversi dokumen via LibreOffice service
    - Database employees

    "Variable template" yg ada :
    list2-template.fodt :
    {DATA}
    list2-data-ganjil.fodt
    {NAME}
    {TITLE}
    {DEPARTMENT}
    list2-data-genap.fodt
    {NAME}
    {TITLE}
    {DEPARTMENT}

    Seperti contoh sebelumnya, beberapa bagian hanya di copy-paste dan diringkas.
    Kode PHP
    <?php

    set_time_limit(0);

    if(trim(strtolower($_SERVER['QUERY_STRING']))=='doc') {$EXTENSION='doc';$CONTENT_TYPE='application/vnd.ms-word';$CONVERT_TO='doc';}
    else if(trim(strtolower($_SERVER['QUERY_STRING']))=='docx') {$EXTENSION='docx';$CONTENT_TYPE='application/msword';$CONVERT_TO='docx7';}
    else {$EXTENSION='pdf';$CONTENT_TYPE='application/pdf';$CONVERT_TO='pdf';}

    $NEWLINE='<text:line-break/>';
    $PAGEBREAK='<text:soft-page-break/>';

    $host_libreoffice='127.0.0.1';
    $port_libreoffice='8080';

    $db=mysqli_connect('localhost','root','','employees') or die(mysqli_connect_errno().': '.mysqli_connect_error());

    $template='C:/template/';
    $temp='C:/temp/';

    $unoconv=
    '"C:/Program Files/LibreOffice/program/python.exe" "C:/Program Files/LibreOffice/program/unoconv" '.
    '--connection "socket,host='.$host_libreoffice.',port='.$port_libreoffice.',tcpNoDelay=1;urp;StarOffice.ComponentContext" ';

    $report_time=date('_Ymd_His').sprintf('_%06d',mt_rand(0,999999));

    // nama file output / hasil
    $report_name='list2';

    // ambil isi file template
    $template_doc=file_get_contents($template.'list2-template.fodt');
    $template_data_ganjil=file_get_contents($template.'list2-data-ganjil.fodt');
    $template_data_genap=file_get_contents($template.'list2-data-genap.fodt');

    // variable template
    $var_doc='{DATA}';
    // variable template ganjil / genap sama bentuknya
    $var_data=array('{NAME}','{TITLE}','{DEPARTMENT}');

    $qry=mysqli_query($db,
    'SELECT
    CONCAT(e.last_name,", ",e.first_name) AS `name`,
    GROUP_CONCAT(t.title ORDER BY t.from_date DESC SEPARATOR ",") AS `title`,
    GROUP_CONCAT(d.dept_name ORDER BY de.from_date DESC SEPARATOR ",") AS `dept_name`
    FROM employees e
    LEFT JOIN titles t ON t.emp_no=e.emp_no
    LEFT JOIN dept_emp de ON de.emp_no=e.emp_no
    LEFT JOIN departments d ON d.dept_no=de.dept_no
    GROUP BY `name` ASC'
    ) or die(mysqli_errno($db).': '.mysqli_error($db));

    $DOC='';
    $value_doc='';

    $baris=1;
    while($rec=(mysqli_fetch_assoc($qry))) {
    $rec['title']=explode(',',$rec['title']);$rec['title']=$rec['title'][0];
    $rec['dept_name']=explode(',',$rec['dept_name']);$rec['dept_name']=$rec['dept_name'][0];

    $value_doc.=
    str_replace(
    $var_data,
    array($rec['name'],$rec['title'],$rec['dept_name']),
    ( $baris==1 ? $template_data_ganjil : $template_data_genap ) // tentukan menggunakan template ganjil / genap
    );

    $baris = $baris==1 ? 0 : 1; // tentukan baris berikut ganjil / genap
    }

    $DOC=str_replace($var_doc,$value_doc,$template_doc);
    file_put_contents($temp.$report_name.$report_time.'.fodt',$DOC);

    exec(
    $unoconv.
    '-f '.$CONVERT_TO.' '.
    '-o "'.$temp.$report_name.$report_time.'.'.$EXTENSION.'" '.
    '"'.$temp.$report_name.$report_time.'.fodt"'
    );

    unlink($temp.$report_name.$report_time.'.fodt');

    header('Expires: Tue, 1 Jan 1980 00:00:00 GMT');
    header('Cache-Control: no-cache');
    header('Pragma: no-cache');
    header('Content-Disposition: attachment; filename="'.$report_name.$report_time.'.'.$EXTENSION.'"');
    header('Content-Type: '.$CONTENT_TYPE);
    readfile($temp.$report_name.$report_time.'.'.$EXTENSION);

    unlink($temp.$report_name.$report_time.'.'.$EXTENSION);

    ?>

    Dari koding contoh sederhana, contoh 1 dan contoh 2 ini, sebenarnya tidak banyak yg berubah. Kerangka alur kodingnya sama.
    Untuk contoh-contoh berikut juga tidak akan bergeser jauh dari kerangka alur yg ada.

    Hal itu menunjukan membuat laporan / dokumen PDF / DOC / DOCX atau dokumen office lainnya tidak sulit, selama LibreOffice dapat digunakan di server.
    Kerepotan hanya akan ada pada saat memodifikasi file LibreOffice (FODT), mengganti isinya dengan "variable template" yg tepat.

    Cara pemanggilan script sama seperti koding sebelumnya, dapat disertakan parameter ?doc / ?docx / ?pdf sesuai dokumen yg dibutuhkan.

    Dari dokumen template awal
    Setelah diproses di dalam koding, sudah siap menjadi dokumen yg dikehendaki, misal file PDF



    Kembali ke : [SESI 2] [Langkah 2] Editing template .FODT : Contoh Bentuk 2 (Tabular Berwarna Ganjil Genap)
    ▲ Daftar Isi ▲
  • edited April 29
    [Langkah 2] Script PHP template dgn loop data (lanjutan)

    Koding Untuk Contoh Bentuk 3

    Dengan menggunakan template yg sudah dibuat pada bagian :
    [SESI 2] [Langkah 2] Editing template .FODT : Contoh Bentuk 3 (Tabular w/ Header, Footer, Page Numbering, Table Header)

    Resource yg sudah dimiliki :
    - File template
    C:\template\list3-template.fodt
    C:\template\list3-data.fodt
    - Temporary folder C:\temp\
    - LibreOffice sudah dijalankan sebagai service
    - Perintah CLI konversi dokumen via LibreOffice service
    - Database employees

    "Variable template" yg ada :
    list3-template.fodt :
    {DATE}
    {TO}
    {FROM}
    {DATA}
    list3-data.fodt
    {NO}
    {EMP_NO}
    {EMP_LASTNAME}
    {EMP_FIRSTNAME}
    {EMP_TITLE}
    {EMP_DEPARTMENT}

    Seperti contoh sebelumnya, beberapa bagian hanya di copy-paste dan diringkas.
    Kode PHP
    <?php

    set_time_limit(0);

    if(trim(strtolower($_SERVER['QUERY_STRING']))=='doc') {$EXTENSION='doc';$CONTENT_TYPE='application/vnd.ms-word';$CONVERT_TO='doc';}
    else if(trim(strtolower($_SERVER['QUERY_STRING']))=='docx') {$EXTENSION='docx';$CONTENT_TYPE='application/msword';$CONVERT_TO='docx7';}
    else {$EXTENSION='pdf';$CONTENT_TYPE='application/pdf';$CONVERT_TO='pdf';}

    $NEWLINE='<text:line-break/>';
    $PAGEBREAK='<text:soft-page-break/>';

    $host_libreoffice='127.0.0.1';
    $port_libreoffice='8080';

    $db=mysqli_connect('localhost','root','','employees') or die(mysqli_connect_errno().': '.mysqli_connect_error());

    $template='C:/template/';
    $temp='C:/temp/';

    $unoconv=
    '"C:/Program Files/LibreOffice/program/python.exe" "C:/Program Files/LibreOffice/program/unoconv" '.
    '--connection "socket,host='.$host_libreoffice.',port='.$port_libreoffice.',tcpNoDelay=1;urp;StarOffice.ComponentContext" ';

    $report_time=date('_Ymd_His').sprintf('_%06d',mt_rand(0,999999));

    // nama file output / hasil
    $report_name='list3';

    // ambil isi file template
    $template_doc=file_get_contents($template.'list3-template.fodt');
    $template_data=file_get_contents($template.'list3-data.fodt');

    // variable template
    $var_doc=array('{DATE}','{TO}','{FROM}','{DATA}');
    $var_data=array('{NO}','{EMP_NO}','{EMP_LASTNAME}','{EMP_FIRSTNAME}','{EMP_TITLE}','{EMP_DEPARTMENT}');

    $qry=mysqli_query($db,
    'SELECT
    e.emp_no,
    CONCAT(e.last_name,", ",e.first_name) AS `name`,
    e.last_name,
    e.first_name,
    GROUP_CONCAT(t.title ORDER BY t.from_date DESC SEPARATOR ",") AS `title`,
    GROUP_CONCAT(d.dept_name ORDER BY de.from_date DESC SEPARATOR ",") AS `dept_name`
    FROM employees e
    LEFT JOIN titles t ON t.emp_no=e.emp_no
    LEFT JOIN dept_emp de ON de.emp_no=e.emp_no
    LEFT JOIN departments d ON d.dept_no=de.dept_no
    GROUP BY `name` ASC'
    ) or die(mysqli_errno($db).': '.mysqli_error($db));

    $DOC='';
    $value_doc='';

    $no=1; // inisialisasi nomor baris
    while($rec=(mysqli_fetch_assoc($qry))) {
    $rec['title']=explode(',',$rec['title']);$rec['title']=$rec['title'][0];
    $rec['dept_name']=explode(',',$rec['dept_name']);$rec['dept_name']=$rec['dept_name'][0];

    $value_doc.=
    str_replace(
    $var_data,
    array($no,$rec['emp_no'],$rec['last_name'],$rec['first_name'],$rec['title'],$rec['dept_name']),
    $template_data
    );

    $no++; // nomor baris
    }

    $DOC=
    str_replace(
    $var_doc,
    array(date('d F Y'),'Vice President','HRD Manager',$value_doc),
    $template_doc
    );
    file_put_contents($temp.$report_name.$report_time.'.fodt',$DOC);

    exec(
    $unoconv.
    '-f '.$CONVERT_TO.' '.
    '-o "'.$temp.$report_name.$report_time.'.'.$EXTENSION.'" '.
    '"'.$temp.$report_name.$report_time.'.fodt"'
    );

    unlink($temp.$report_name.$report_time.'.fodt');

    header('Expires: Tue, 1 Jan 1980 00:00:00 GMT');
    header('Cache-Control: no-cache');
    header('Pragma: no-cache');
    header('Content-Disposition: attachment; filename="'.$report_name.$report_time.'.'.$EXTENSION.'"');
    header('Content-Type: '.$CONTENT_TYPE);
    readfile($temp.$report_name.$report_time.'.'.$EXTENSION);

    unlink($temp.$report_name.$report_time.'.'.$EXTENSION);

    ?>
    Dari semua contoh yg sudah ada, dapat dilihat isi koding hanya proses pengisian data.
    Koding sudah tidak direpotkan lagi utk mengurusi pembuatan header, logo header, footer, page numbering, header table yg berulang, border, margin, ukuran halaman, orientasi halaman, dan lain sebagainya yg berhubungan dgn layout dokumen.
    Semuanya sudah dibuat saat membuat dokumen template awal menggunakan Microsoft Office yg tentunya jadi sangat mudah.
    Hasil akhir output dari koding sama persis sesuai dengan dokumen template yg dibuat pada saat awal.

    Cara pemanggilan script sama seperti koding sebelumnya, dapat disertakan parameter ?doc / ?docx / ?pdf sesuai dokumen yg dibutuhkan.

    Dari dokumen template awal
    Setelah diproses di dalam koding, sudah siap menjadi dokumen yg dikehendaki, misal file DOC




    Kembali ke : [SESI 2] [Langkah 2] Editing template .FODT : Contoh Bentuk 3 (Tabular w/ Header, Footer, Page Numbering, Table Header)
    ▲ Daftar Isi ▲
  • edited April 29
    [Langkah 2] Script PHP template dgn loop data (lanjutan)

    Koding Untuk Contoh Bentuk 5

    Dengan menggunakan template yg sudah dibuat pada bagian :
    [SESI 2] [Langkah 2] Editing template .FODT : Contoh Bentuk 5 (Tabular Dengan Data Gambar)



    Kembali ke : [SESI 2] [Langkah 2] Editing template .FODT : Contoh Bentuk 5 (Tabular Dengan Data Gambar)
    ▲ Daftar Isi ▲
  • edited April 29
    [Langkah 2] Script PHP template dgn loop data (lanjutan)

    Koding Untuk Contoh Bentuk 7

    Untuk contoh ini, dibutuhkan data dari database. Silakan download backup sql database di attachment.
    File backup sql terpaksa dipisah menjadi 2 karena batasan ukuran file yg bisa di upload.

    candi1.sql.zip
    http://diskusiweb.com/uploads/editor/8f/rrg3t4b8b8n1.zip
    Download backup sql ini, ekstrak, jalankan.
    Otomatis akan membuat database "candi" dan table "candi".
    Sebenarnya dgn backup database ini sdh cukup utk uji coba contoh koding, tapi hanya berisi 3 data.

    candi2.sql.zip
    http://diskusiweb.com/uploads/editor/pe/h97wviqfz5we.zip
    Tambahan 2 data lagi untuk database "candi", table "candi" (candi1.sql harus dijalankan terlebih dulu).
    Total data utk uji coba menjadi 5 data.

    Dengan menggunakan template yg sudah dibuat pada bagian :
    [SESI 2] [Langkah 2] Editing template .FODT : Contoh Bentuk 7 (Sejenis Buku Panduan / Brosur / Leaflet)

    Seperti contoh sebelumnya, beberapa bagian hanya di copy-paste dan diringkas.
    Kode PHP
    <?php

    set_time_limit(0);

    if(trim(strtolower($_SERVER['QUERY_STRING']))=='doc') {$EXTENSION='doc';$CONTENT_TYPE='application/vnd.ms-word';$CONVERT_TO='doc';}
    else if(trim(strtolower($_SERVER['QUERY_STRING']))=='docx') {$EXTENSION='docx';$CONTENT_TYPE='application/msword';$CONVERT_TO='docx7';}
    else {$EXTENSION='pdf';$CONTENT_TYPE='application/pdf';$CONVERT_TO='pdf';}

    $NEWLINE='<text:line-break/>';
    $PAGEBREAK='<text:soft-page-break/>';

    function rad2mapdeg($rad,$latlong='lat',$lang='id') {
    $dir=$deg=$min=$sec='';

    if($latlong=='lat') $dir=$rad<0?('S'):('N');
    else $dir=$rad<0?('W'):('E');

    $rad=abs($rad);

    $deg=floor($rad);$rad-=$deg;$rad*=60;
    $min=floor($rad);$rad-=$min;$sec=$rad*60;
    $sec=round($sec,2);

    $dir_id=array('S'=>'LS','N'=>'LU','E'=>'BT','W'=>'BB');
    if($lang=='id') $dir=$dir_id[$dir];

    return array($deg,$min,$sec,$dir);
    }

    function distance($radlatsrc,$radlongsrc,$radlatdest,$radlongdesc,$unit='km') {
    if(($radlatsrc!=0 && $radlongsrc!=0) || ($radlatdest!=0 && $radlongdesc!=0)) {
    $dist=(acos(sin($radlatsrc*pi()/180)*sin($radlatdest*pi()/180)+cos($radlatsrc*pi()/180)*cos($radlatdest*pi()/180)*cos(($radlongsrc-$radlongdesc)*pi()/180))*180/pi())*60*1.1515*1.609344;
    if($unit=='m') $dist*=1000;
    }
    else $dist=0;
    return $dist;
    }

    function cleanstring($str) {
    global $NEWLINE;
    return str_replace(array('&',"\r","\n"),array('&amp;','',$NEWLINE),$str)
    }

    $host_libreoffice='127.0.0.1';
    $port_libreoffice='8080';

    $db=mysqli_connect('localhost','root','','candi') or die(mysqli_connect_errno().': '.mysqli_connect_error());

    $template='C:/template/';
    $temp='C:/temp/';

    $unoconv=
    '"C:/Program Files/LibreOffice/program/python.exe" "C:/Program Files/LibreOffice/program/unoconv" '.
    '--connection "socket,host='.$host_libreoffice.',port='.$port_libreoffice.',tcpNoDelay=1;urp;StarOffice.ComponentContext" ';

    $report_time=date('_Ymd_His').sprintf('_%06d',mt_rand(0,999999));

    // nama file output / hasil
    $report_name='dokumen_candi';

    // ambil isi file template
    $template_doc=file_get_contents($template.'candi-template.fodt');
    $template_page=file_get_contents($template.'candi-page.fodt');

    $var_doc=array('{TAHUN}','{PAGE}');
    $var_page=array(
    '{NAMACANDI}',
    '{IMG_FOTOCANDI}',
    '{AGAMA}',
    '{LDEG}','{LMIN}','{LSEC}','{LUS}',
    '{BDEG}','{BMIN}','{BSEC}','{BBT}',
    '{KELURAHAN}','{KECAMATAN}','{KABUPATEN}',
    '{JARAK}','{JARAKDARI}',
    '{TAHUNBANGUN}','{MASAKERAJAAN}',
    '{SEJARAH}',
    '{IMG_KIRIATAS}',
    '{IMG_KANANATAS}',
    '{IMG_KANANTENGAH}',
    '{IMG_BAWAH}'
    );

    $qry=mysqli_query($db,'SELECT * FROM candi') or die(mysqli_errno($db).': '.mysqli_error($db));

    $DOC=$PAGE='';
    $TAHUN=date('Y');

    while($rec=(mysqli_fetch_assoc($qry))) {
    list($LDEG,$LMIN,$LSEC,$LUS)=rad2mapdeg($rec['rad_lintang'],'lat');
    list($BDEG,$BMIN,$BSEC,$BBT)=rad2mapdeg($rec['rad_bujur'],'long');
    $JARAK=distance($rec['rad_lintang'],$rec['rad_bujur'],$rec['rad_lintangkota'],$rec['rad_bujurkota']);

    $value_page=array(
    strtoupper($rec['candi']), // {NAMACANDI}
    base64_encode($rec['foto']), // {IMG_FOTOCANDI}
    ucwords(strtolower($rec['agama'])), // {AGAMA}
    $LDEG,$LMIN,number_format($LSEC,2,',','.'),$LUS, // {LDEG},{LMIN},{LSEC},{LUS}
    $BDEG,$BMIN,number_format($BSEC,2,',','.'),$BBT, // {BDEG},{BMIN},{BSEC},{BBT}
    $rec['kelurahan'],$rec['kecamatan'],$rec['kabupaten'], // {KELURAHAN},{KECAMATAN},{KABUPATEN}
    number_format($JARAK,2,',','.').' Km',$rec['kota'], // {JARAK},{JARAKDARI}
    $rec['tahun'],$rec['masa'], // {TAHUNBANGUN},{MASAKERAJAAN}
    cleanstring($rec['sejarah']), // {SEJARAH}
    base64_encode($rec['image1']), // {IMG_KIRIATAS}
    base64_encode($rec['image2']), // {IMG_KANANATAS}
    base64_encode($rec['image3']), // {IMG_KANANTENGAH}
    base64_encode($rec['peta']) // {IMG_BAWAH}
    );

    $PAGE.=str_replace($var_page,$value_page,$template_page);
    }

    $value_doc=array($TAHUN,$PAGE);

    $DOC=str_replace($var_doc,$value_doc,$template_doc);
    file_put_contents($temp.$report_name.$report_time.'.fodt',$DOC);

    exec(
    $unoconv.
    '-f '.$CONVERT_TO.' '.
    '-o "'.$temp.$report_name.$report_time.'.'.$EXTENSION.'" '.
    '"'.$temp.$report_name.$report_time.'.fodt"'
    );

    unlink($temp.$report_name.$report_time.'.fodt');

    header('Expires: Tue, 1 Jan 1980 00:00:00 GMT');
    header('Cache-Control: no-cache');
    header('Pragma: no-cache');
    header('Content-Disposition: attachment; filename="'.$report_name.$report_time.'.'.$EXTENSION.'"');
    header('Content-Type: '.$CONTENT_TYPE);
    readfile($temp.$report_name.$report_time.'.'.$EXTENSION);

    unlink($temp.$report_name.$report_time.'.'.$EXTENSION);

    ?>

    Seperti contoh 5, contoh ini juga menggunakan gambar.
    Data gambar sdh ada di database dgn bentuk BLOB.
    Jika menggunakan model gambar dari file fisik, gunakan file_get_contents($lokasi_file_gambar).
    Gambar yg ditampilkan harus di base64_encode($data_gambar).

    Tipe gambar bebas.
    Misal pada saat membuat template menggunakan tipe PNG, tapi saat mengisi data menggunakan file / data JPG / JPEG atau yg lainnya.

    Ukuran gambar mengikuti ukuran yg didefinisikan saat membuat template.
    Jika gambar yg diisikan lebih besar / lebar / pendek / kecil, akan mengalami "stretching paksa".
    Agar proporsional, width / height di tag XML bisa diubah dgn perhitungan, artinya juga diubah menjadi "variable template", atau gambar yg akan dipergunakan di-resize / di-crop di koding php nya.

    Terdapat proses "pembersihan string" utk text yg panjang.
    - mengubah karakter & menjadi &amp;
    - mengubah baris baru / new line menjadi <text:line-break/>

    Cara pemanggilan script sama seperti koding sebelumnya, dapat disertakan parameter ?doc / ?docx / ?pdf sesuai dokumen yg dibutuhkan.

    Dari dokumen template awal
    Setelah diproses di dalam koding, sudah siap menjadi dokumen yg dikehendaki, misal file DOC




    Kembali ke : [SESI 2] [Langkah 2] Editing template .FODT : Contoh Bentuk 7 (Sejenis Buku Panduan / Brosur / Leaflet)
    ▲ Daftar Isi ▲

  • edited April 29
    [Langkah 3] Script PHP template dgn loop data di dalam loop

    Koding Untuk Contoh Bentuk 4

    Dengan menggunakan template yg sudah dibuat pada bagian :
    [SESI 2] [Langkah 2] Editing template .FODT : Contoh Bentuk 4 (Tabular, Loop Data Bertingkat)

    Resource yg sudah dimiliki :
    - File template
    C:\template\list4-template.fodt
    C:\template\list4-table.fodt
    C:\template\list4-data.fodt
    - Temporary folder C:\temp\
    - LibreOffice sudah dijalankan sebagai service
    - Perintah CLI konversi dokumen via LibreOffice service
    - Database employees

    "Variable template" yg ada :
    list4-template.fodt :
    {DATE}
    {TO}
    {FROM}
    {TABLE}
    list4-table.fodt
    {DEPARTMENT}
    {DATA}
    {NUM_MALE}
    {NUM_FEMALE}
    {NUM_ASSISTANT}
    {NUM_REGULAR}
    {NUM_SENIOR}
    {NUM_LEADER}
    list4-data.fodt
    {NO}
    {EMP_NO}
    {EMP_LASTNAME}
    {EMP_FIRSTNAME}
    {EMP_TITLE}

    Seperti contoh sebelumnya, beberapa bagian hanya di copy-paste dan diringkas.
    Kode PHP
    <?php

    set_time_limit(0);

    if(trim(strtolower($_SERVER['QUERY_STRING']))=='doc') {$EXTENSION='doc';$CONTENT_TYPE='application/vnd.ms-word';$CONVERT_TO='doc';}
    else if(trim(strtolower($_SERVER['QUERY_STRING']))=='docx') {$EXTENSION='docx';$CONTENT_TYPE='application/msword';$CONVERT_TO='docx7';}
    else {$EXTENSION='pdf';$CONTENT_TYPE='application/pdf';$CONVERT_TO='pdf';}

    $NEWLINE='<text:line-break/>';
    $PAGEBREAK='<text:soft-page-break/>';

    $host_libreoffice='127.0.0.1';
    $port_libreoffice='8080';

    $db=mysqli_connect('localhost','root','','employees') or die(mysqli_connect_errno().': '.mysqli_connect_error());

    $template='C:/template/';
    $temp='C:/temp/';

    $unoconv=
    '"C:/Program Files/LibreOffice/program/python.exe" "C:/Program Files/LibreOffice/program/unoconv" '.
    '--connection "socket,host='.$host_libreoffice.',port='.$port_libreoffice.',tcpNoDelay=1;urp;StarOffice.ComponentContext" ';

    $report_time=date('_Ymd_His').sprintf('_%06d',mt_rand(0,999999));

    // nama file output / hasil
    $report_name='list4';

    // ambil isi file template
    $template_doc=file_get_contents($template.'list4-template.fodt');
    $template_table=file_get_contents($template.'list4-table.fodt');
    $template_data=file_get_contents($template.'list4-data.fodt');

    // variable template
    $var_doc=array('{DATE}','{TO}','{FROM}','{TABLE}');
    $var_table=array('{DEPARTMENT}','{DATA}','{NUM_MALE}','{NUM_FEMALE}','{NUM_ASSISTANT}','{NUM_REGULAR}','{NUM_SENIOR}','{NUM_LEADER}');
    $var_data=array('{NO}','{EMP_NO}','{EMP_LASTNAME}','{EMP_FIRSTNAME}','{EMP_TITLE}');

    $qry=mysqli_query($db,
    'SELECT
    e.emp_no,
    CONCAT(e.last_name,", ",e.first_name) AS `name`,
    e.last_name,
    e.first_name,
    e.gender,
    GROUP_CONCAT(DISTINCT t.title ORDER BY t.from_date DESC SEPARATOR ",") AS `title`,
    GROUP_CONCAT(DISTINCT d.dept_name ORDER BY de.from_date DESC SEPARATOR ",") AS `dept_name`
    FROM employees e
    LEFT JOIN titles t ON t.emp_no=e.emp_no
    LEFT JOIN dept_emp de ON de.emp_no=e.emp_no
    LEFT JOIN departments d ON d.dept_no=de.dept_no
    GROUP BY `name`
    ORDER BY `dept_name`,`name`'
    ) or die(mysqli_errno($db).': '.mysqli_error($db));

    $DOC=$TABLE='';
    $value_table='';

    $no=1; // inisialisasi nomor baris
    $department=''; // inisialisasi department
    $num_male=$num_female=$num_assistant=$num_regular=$num_senior=$num_leader=0; // inisialisasi semua variable jumlah

    while($rec=(mysqli_fetch_assoc($qry))) {
    $rec['title']=explode(',',$rec['title']);$rec['title']=$rec['title'][0];
    $rec['dept_name']=explode(',',$rec['dept_name']);$rec['dept_name']=$rec['dept_name'][0];

    if($department!=$rec['dept_name']) { // buat tabel baru jika ditemukan nama department berubah
    if($value_table!='') {
    $TABLE.=
    str_replace(
    $var_table,
    array($department,$value_table,$num_male,$num_female,$num_assistant,$num_regular,$num_senior,$num_leader),
    $template_table
    );
    }
    $value_table=''; // reset ulang isi table, kembali ke string kosong
    $no=1; // reset ulang nomor baris, kembali ke 1
    $department=$rec['dept_name']; // set nama department ke nama baru utk deteksi perubahan nama berikutnya
    $num_male=$num_female=$num_assistant=$num_regular=$num_senior=$num_leader=0; // reset ulang perhitungan jumlah, kembali ke 0
    }
    $value_table.=
    str_replace(
    $var_data,
    array($no,$rec['emp_no'],'['.$rec['gender'].'] '.$rec['last_name'],$rec['first_name'],$rec['title']),
    $template_data
    );

    if($rec['gender']=='M') { $num_male++; } else { $num_female++; }
    if(substr($rec['title'],0,6)=='Senior') { $num_senior++; }
    else if(substr($rec['title'],0,6)=='Assist') { $num_assistant++; }
    else if(substr($rec['title'],-6)=='Leader') { $num_leader++; }
    else { $num_regular++; }

    $no++; // nomor baris
    }

    if($value_table!='') { // tabel terakhir
    $TABLE.=
    str_replace(
    $var_table,
    array($department,$value_table,$num_male,$num_female,$num_assistant,$num_regular,$num_senior,$num_leader),
    $template_table
    );
    }

    $DOC=
    str_replace(
    $var_doc,
    array(date('d F Y'),'Vice President','HRD Manager',$TABLE),
    $template_doc
    );
    file_put_contents($temp.$report_name.$report_time.'.fodt',$DOC);

    exec(
    $unoconv.
    '-f '.$CONVERT_TO.' '.
    '-o "'.$temp.$report_name.$report_time.'.'.$EXTENSION.'" '.
    '"'.$temp.$report_name.$report_time.'.fodt"'
    );

    unlink($temp.$report_name.$report_time.'.fodt');

    header('Expires: Tue, 1 Jan 1980 00:00:00 GMT');
    header('Cache-Control: no-cache');
    header('Pragma: no-cache');
    header('Content-Disposition: attachment; filename="'.$report_name.$report_time.'.'.$EXTENSION.'"');
    header('Content-Type: '.$CONTENT_TYPE);
    readfile($temp.$report_name.$report_time.'.'.$EXTENSION);

    unlink($temp.$report_name.$report_time.'.'.$EXTENSION);

    ?>
    Sama seperti contoh-contoh sebelumnya, tugas programmer dalam membuat koding di sini hanya sebatas "mengisi data", tanpa perlu direpotkan menyusun layout dan lain sebagainya.

    Bentuk yg khusus pada template ini adalah adanya perulangan 2 tingkat.
    - Data berulang di dalam table.
    - Table berulang di dalam dokumen.

    Tapi pada kodingnya, jika sudah terbiasa menghadapi masalah seperti ini pun yg dibuat tetap 1 loop dan dengan cukup 1 query.
    Hal ini tentu akan menjadi lebih ringan untuk alur kodingnya sendiri.

    Cara pemanggilan script sama seperti koding sebelumnya, dapat disertakan parameter ?doc / ?docx / ?pdf sesuai dokumen yg dibutuhkan.

    Ada "cacat" layout table pada border jika di generate menjadi DOCX.
    Belum dilihat lebih jauh penyebabnya.


    Dari dokumen template awal

    Setelah diproses di dalam koding, sudah siap menjadi dokumen yg dikehendaki, misal file DOC





    Kembali ke : [SESI 2] [Langkah 2] Editing template .FODT : Contoh Bentuk 4 (Tabular, Loop Data Bertingkat)
    ▲ Daftar Isi ▲
  • edited April 29
    [Langkah 3] Script PHP template dgn loop data di dalam loop (lanjutan)

    Koding Untuk Contoh Bentuk 6

    Dengan menggunakan template yg sudah dibuat pada bagian :
    [SESI 2] [Langkah 2] Editing template .FODT : Contoh Bentuk 6 (List, List Bertingkat, Chart)



    Kembali ke : [SESI 2] [Langkah 2] Editing template .FODT : Contoh Bentuk 6 (List, List Bertingkat, Chart)
    ▲ Daftar Isi ▲
  • edited April 30
    [TAMBAHAN] Catatan pribadi kekurangan dan kelebihan penggunaan LibreOffice dan masalah yg pernah ditemui

    Ringkasan Langkah
    [Pekerjaan Awal]
    - Download dan install LibreOffice
    - Download dan copy unoconv
    - Di mesin produksi, jalankan LibreOffice sebagai service
    [Pekerjaan Rutin]
    - Buat template dgn Microsoft Office (Word / Excel / PowerPoint), bentuk bebas
    - Konversi menjadi .fodt / .fods / .fodp dgn LibreOffice
    - Ubah data dummy menjadi "variable template"
    - Koding mengisi data, merubah "variable template" dgn data yg benar, data gambar menggunakan base64 encoding
    - Simpan menjadi file .fodt / .fods / .fodp
    - Jalankan perintah konversi lewat CLI dari koding

    Referensi unoconv -f parameter
    C:\>"C:/Program Files/LibreOffice/program/python.exe" "C:/Program Files/LibreOffice/program/unoconv" --show

    The following list of document formats are currently available:

    bib - BibTeX [.bib]
    doc - Microsoft Word 97/2000/XP [.doc]
    doc6 - Microsoft Word 6.0 [.doc]
    doc95 - Microsoft Word 95 [.doc]
    docbook - DocBook [.xml]
    docx - Microsoft Office Open XML [.docx]
    docx7 - Microsoft Office Open XML [.docx]
    fodt - OpenDocument Text (Flat XML) [.fodt]
    html - HTML Document (OpenOffice.org Writer) [.html]
    latex - LaTeX 2e [.ltx]
    mediawiki - MediaWiki [.txt]
    odt - ODF Text Document [.odt]
    ooxml - Microsoft Office Open XML [.xml]
    ott - Open Document Text [.ott]
    pdb - AportisDoc (Palm) [.pdb]
    pdf - Portable Document Format [.pdf]
    psw - Pocket Word [.psw]
    rtf - Rich Text Format [.rtf]
    sdw - StarWriter 5.0 [.sdw]
    sdw4 - StarWriter 4.0 [.sdw]
    sdw3 - StarWriter 3.0 [.sdw]
    stw - Open Office.org 1.0 Text Document Template [.stw]
    sxw - Open Office.org 1.0 Text Document [.sxw]
    text - Text Encoded [.txt]
    txt - Text [.txt]
    uot - Unified Office Format text [.uot]
    vor - StarWriter 5.0 Template [.vor]
    vor4 - StarWriter 4.0 Template [.vor]
    vor3 - StarWriter 3.0 Template [.vor]
    wps - Microsoft Works [.wps]
    xhtml - XHTML Document [.html]

    The following list of graphics formats are currently available:

    bmp - Windows Bitmap [.bmp]
    emf - Enhanced Metafile [.emf]
    eps - Encapsulated PostScript [.eps]
    fodg - OpenDocument Drawing (Flat XML) [.fodg]
    gif - Graphics Interchange Format [.gif]
    html - HTML Document (OpenOffice.org Draw) [.html]
    jpg - Joint Photographic Experts Group [.jpg]
    met - OS/2 Metafile [.met]
    odd - OpenDocument Drawing [.odd]
    otg - OpenDocument Drawing Template [.otg]
    pbm - Portable Bitmap [.pbm]
    pct - Mac Pict [.pct]
    pdf - Portable Document Format [.pdf]
    pgm - Portable Graymap [.pgm]
    png - Portable Network Graphic [.png]
    ppm - Portable Pixelmap [.ppm]
    ras - Sun Raster Image [.ras]
    std - OpenOffice.org 1.0 Drawing Template [.std]
    svg - Scalable Vector Graphics [.svg]
    svm - StarView Metafile [.svm]
    swf - Macromedia Flash (SWF) [.swf]
    sxd - OpenOffice.org 1.0 Drawing [.sxd]
    sxd3 - StarDraw 3.0 [.sxd]
    sxd5 - StarDraw 5.0 [.sxd]
    sxw - StarOffice XML (Draw) [.sxw]
    tiff - Tagged Image File Format [.tiff]
    vor - StarDraw 5.0 Template [.vor]
    vor3 - StarDraw 3.0 Template [.vor]
    wmf - Windows Metafile [.wmf]
    xhtml - XHTML [.xhtml]
    xpm - X PixMap [.xpm]

    The following list of presentation formats are currently available:

    bmp - Windows Bitmap [.bmp]
    emf - Enhanced Metafile [.emf]
    eps - Encapsulated PostScript [.eps]
    fodp - OpenDocument Presentation (Flat XML) [.fodp]
    gif - Graphics Interchange Format [.gif]
    html - HTML Document (OpenOffice.org Impress) [.html]
    jpg - Joint Photographic Experts Group [.jpg]
    met - OS/2 Metafile [.met]
    odg - ODF Drawing (Impress) [.odg]
    odp - ODF Presentation [.odp]
    otp - ODF Presentation Template [.otp]
    pbm - Portable Bitmap [.pbm]
    pct - Mac Pict [.pct]
    pdf - Portable Document Format [.pdf]
    pgm - Portable Graymap [.pgm]
    png - Portable Network Graphic [.png]
    potm - Microsoft PowerPoint 2007/2010 XML Template [.potm]
    pot - Microsoft PowerPoint 97/2000/XP Template [.pot]
    ppm - Portable Pixelmap [.ppm]
    pptx - Microsoft PowerPoint 2007/2010 XML [.pptx]
    pps - Microsoft PowerPoint 97/2000/XP (Autoplay) [.pps]
    ppt - Microsoft PowerPoint 97/2000/XP [.ppt]
    pwp - PlaceWare [.pwp]
    ras - Sun Raster Image [.ras]
    sda - StarDraw 5.0 (OpenOffice.org Impress) [.sda]
    sdd - StarImpress 5.0 [.sdd]
    sdd3 - StarDraw 3.0 (OpenOffice.org Impress) [.sdd]
    sdd4 - StarImpress 4.0 [.sdd]
    sxd - OpenOffice.org 1.0 Drawing (OpenOffice.org Impress) [.sxd]
    sti - OpenOffice.org 1.0 Presentation Template [.sti]
    svg - Scalable Vector Graphics [.svg]
    svm - StarView Metafile [.svm]
    swf - Macromedia Flash (SWF) [.swf]
    sxi - OpenOffice.org 1.0 Presentation [.sxi]
    tiff - Tagged Image File Format [.tiff]
    uop - Unified Office Format presentation [.uop]
    vor - StarImpress 5.0 Template [.vor]
    vor3 - StarDraw 3.0 Template (OpenOffice.org Impress) [.vor]
    vor4 - StarImpress 4.0 Template [.vor]
    vor5 - StarDraw 5.0 Template (OpenOffice.org Impress) [.vor]
    wmf - Windows Metafile [.wmf]
    xhtml - XHTML [.xml]
    xpm - X PixMap [.xpm]

    The following list of spreadsheet formats are currently available:

    csv - Text CSV [.csv]
    dbf - dBASE [.dbf]
    dif - Data Interchange Format [.dif]
    fods - OpenDocument Spreadsheet (Flat XML) [.fods]
    html - HTML Document (OpenOffice.org Calc) [.html]
    ods - ODF Spreadsheet [.ods]
    ooxml - Microsoft Excel 2003 XML [.xml]
    ots - ODF Spreadsheet Template [.ots]
    pdf - Portable Document Format [.pdf]
    pxl - Pocket Excel [.pxl]
    sdc - StarCalc 5.0 [.sdc]
    sdc4 - StarCalc 4.0 [.sdc]
    sdc3 - StarCalc 3.0 [.sdc]
    slk - SYLK [.slk]
    stc - OpenOffice.org 1.0 Spreadsheet Template [.stc]
    sxc - OpenOffice.org 1.0 Spreadsheet [.sxc]
    uos - Unified Office Format spreadsheet [.uos]
    vor3 - StarCalc 3.0 Template [.vor]
    vor4 - StarCalc 4.0 Template [.vor]
    vor - StarCalc 5.0 Template [.vor]
    xhtml - XHTML [.xhtml]
    xls - Microsoft Excel 97/2000/XP [.xls]
    xls5 - Microsoft Excel 5.0 [.xls]
    xls95 - Microsoft Excel 95 [.xls]
    xlt - Microsoft Excel 97/2000/XP Template [.xlt]
    xlt5 - Microsoft Excel 5.0 Template [.xlt]
    xlt95 - Microsoft Excel 95 Template [.xlt]
    xlsx - Microsoft Excel 2007/2010 XML [.xlsx]

    Filtering konten yg perlu dilakukan
    - Baris baru diubah dgn <text:line-break/>
    - DOC / DOCX bisa dipaksa membuat halaman baru dgn <text:soft-page-break/>
    - Karakter & diubah jadi &amp;

    ▲ Daftar Isi ▲
  • edited April 29
    [TAMBAHAN] Catatan pribadi kekurangan dan kelebihan penggunaan LibreOffice dan masalah yg pernah ditemui (lanjutan)

    Kesalahan yg pernah ditemukan
    - Karakter & di dalam naskah, harus diubah dulu menjadi &amp;
    - Border slash-dot dikenali di PDF & DOC, tapi tidak dikenali di DOCX
    - Konten table 2 kolom (atau lebih), data berupa gambar kadang lompat ke halaman berikut terpengaruh isi dari kolom yg lain
    - Konten PowerPoint basis nya frame, 1 frame per halaman, tidak bisa otomatis membuat slide baru jika isi melebihi slide, jadi mesti pintar mengatur panjang konten.
    Berbeda dgn konten DOC / DOCX / XLS / XLSX yg bisa dibuat panjang dan otomatis ganti halaman

    ▲ Daftar Isi ▲
  • edited April 29
    [TAMBAHAN] Catatan pribadi kekurangan dan kelebihan penggunaan LibreOffice dan masalah yg pernah ditemui (lanjutan)

    Dari thread SEPUTAR MEMBUAT LAPORAN DENGAN PHP
    http://diskusiweb.com/discussion/comment/256510/#Comment_256510
    http://diskusiweb.com/discussion/comment/256511/#Comment_256511

    Penggunaan LibreOffice utk membuat dokumen / laporan
    Keuntungan :
    - Super fleksible, pengembangan dapat digali lebih jauh
    - Dapat memisahkan tugas pembuatan template dan koding script
    - Hasil bagus, kalau pun layout ada melesetnya sangat minim
    - Ringan di php nya, lama proses tergantung ukuran dokumen
    - Koding php sederhana, hanya proses isi data tanpa perlu mengurusi format dokumen lagi
    - Jenis format dokumen yg bisa dihasilkan beragam hanya dgn 1 (satu) template yg sama
    - Jika terjadi kesalahan hasil, biasanya koding tidak perlu diubah, hanya template yg perlu diubah selama masih menggunakan "variable template" yg sama
    - Dapat dipakai utk banyak bahasa pemrograman

    Kerugian :
    - Hanya dapat dipakai di server sendiri, atau minimal server lokal di LAN
    - Harus install aplikasi suite yg memakan space lebih dari 300MB

    Perbandingan pembuatan dokumen / laporan dengan metode lain
    Umumnya cara yg dipakai untuk membuat laporan PDF / DOC / XLS adalah menggunakan tambahan librari script php
    - PDF : FPDF, TCPDF, HTML2PDF, MPDF dan sejenisnya
    - Word : phpdocx (berbayar)
    - Excel : phpexcel

    Keuntungan :
    - Dapat digunakan di shared hosting dan server sendiri
    - Dapat utk membuat dokumen dengan format profesional

    Kerugian :
    - Tiap format dokumen / laporan yg ingin dibuat membutuhkan librari yg berbeda, dengan bentuk koding yg berbeda pula
    - TCPDF, MPDF, FPDF (meskipun ditambah penggunaan librari HTML2PDF), lebih repot mengatur layout, karena pembuatan layout masih bercampur dengan koding isi data
    - phpdocx, phpexcel, hasil output masih banyak yg meleset dari format yg diinginkan
    - Beban konversi menjadi lebih berat di sisi php, menguras resource, terutama cpu dan memori, perlu diingat php itu hanya interpreter
    - Sulit membuat template yg bisa diserahkan pekerjaannya ke operator
    - Untuk membuat 1 laporan, programmer harus memikirkan bentuk laporan mulai dari membentuk layout dan format melalui baris-baris koding
    - Pembuatan 1 script hanya utk laporan yg dimaksud, jika membuat laporan PDF hasilnya hanya PDF, untuk membuat format lain harus membuat bagian koding yg berbeda

    Alternatif lain yg dapat digunakan di server shared hosting :
    - Header menggunakan header XLS / DOC
    - Berisi HTML

    Keuntungan :
    - Sangat sederhana, tidak membutuh tambahan librari / aplikasi lain
    - Dapat digunakan di shared hosting dan server sendiri
    - Hanya HTML, seperti membuat halaman web biasa
    - Ringan, tapi tetap bisa menjadi berat jika datanya banyak

    Kerugian :
    - Sulit membuat halaman dokumen laporan yg profesional
    - Saat dibuka dgn Word / Excel editing tetap konten HTML, bukan format asli dokumen Word / Excel
    - Sulit membuat multi page di Word dan multi sheet di Excel
    - Sulit membuat header / footer / page numbering di tiap halaman
    - Pembuatan layout laporan tetap bercampur dgn koding

    Jika harus membuat dokumen / laporan yg berukuran besar / banyak data, menggunakan LibreOffice juga memakan waktu lama.
    Tapi masih lebih baik dibanding librari php berupa script, karena LibreOffice itu aplikasi desktop, bukan script utk interpreter.

    Jika harus menghasilkan dokumen besar, baik librari script php atau LibreOffice harus mengubah seting time limit eksekusi php menjadi 0 (tanpa batas waktu)
    Hasil keluaran lebih cepat dihasilkan dari LibreOffice.
    Penggunaan librari script php bisa menjadi hang jika dokumen terlalu besar.

    Pilihan menggunakan librari script php / konten HTML terpaksa dilakukan jika menggunakan shared hosting.
    Itu pun dengan risiko akun akan di suspend oleh admin server karena menguras resource jika harus membuat dokumen besar.
    Pilihan menggunakan konten HTML adalah cara yg paling ringan bebannya.

    Untuk server yg dikelola sendiri (minimal penggunaan server lokal untuk LAN), lebih disarankan dan lebih baik menggunakan LibreOffice.
    Kecuali ada alternatif aplikasi desktop lain yg lebih baik.

    Dengan membuat 1 (satu) template, bisa digunakan untuk lebih dari satu format dokumen / laporan, dan dapat digunakan utk bahasa pemrograman yg berbeda-beda

    ▲ Daftar Isi ▲
  • edited April 29
    Post banyak disingkat karena posting membatasi panjang karakter.
    File contoh selalu disertakan di attachment.

    [CONTOH] Contoh template, database dan koding PHP

    [1] Laporan Excel (Tabular Sederhana)
    Tiruan laporan contoh 1, hanya diubah menggunakan Excel dari yg sebelumnya menggunakan Word.

    Template
    http://diskusiweb.com/uploads/editor/uf/fn5sq1hiobqv.zip
    Dibuat menggunakan Microsoft Excel, list1.xlsx.
    Jangan lupa, jika hendak membuat laporan PDF menggunakan template yg sama, lakukan "Set Print Area", atur "Page Width" dan "Page Orientation".
    Buka dgn LibreOffice Calc, simpan jadi .FODS, list1.fods

    Edit list1.fods dgn Text Editor.
    Seperti langkah contoh sebelumnya, cari terlebih dahulu perulangan data.

    Ambil template baris data, ubah jadi "variable template", simpan jadi list1-data.fods.
        <table:table-row table:style-name="ro1">
    <table:table-cell/>
    <table:table-cell table:style-name="ce2" office:value-type="string" calcext:value-type="string">
    <text:p>{EMP_NO}</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="ce8" office:value-type="string" calcext:value-type="string">
    <text:p>{EMP_LASTNAME}</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="ce8" office:value-type="string" calcext:value-type="string">
    <text:p>{EMP_FIRSTNAME}</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="ce12" office:value-type="string" calcext:value-type="string">
    <text:p>{EMP_GENDER}</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="ce8" office:value-type="string" calcext:value-type="string">
    <text:p>{EMP_TITLE}</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="ce16" office:value-type="string" calcext:value-type="string">
    <text:p>{EMP_DEPARTMENT}</text:p>
    </table:table-cell>
    <table:table-cell table:number-columns-repeated="1017"/>
    </table:table-row>
    Bagian perulangan data ubah jadi "variable template" {DATA}.
    Simpan file template menjadi list1-template.fods
        ...
    <table:table-cell table:style-name="ce7" office:value-type="string" calcext:value-type="string">
    <text:p>Last Title</text:p>
    </table:table-cell>
    <table:table-cell table:style-name="ce15" office:value-type="string" calcext:value-type="string">
    <text:p>Department</text:p>
    </table:table-cell>
    <table:table-cell table:number-columns-repeated="1017"/>
    </table:table-row>
    {DATA}
    <table:table-row table:style-name="ro1">
    <table:table-cell/>
    <table:table-cell table:style-name="ce5"/>
    <table:table-cell table:style-name="ce11" table:number-columns-repeated="5"/>
    <table:table-cell table:number-columns-repeated="1017"/>
    </table:table-row>
    ...
    Hasil akhir template :
    http://diskusiweb.com/uploads/editor/6f/r0xnbvs8ke1g.zip

    Kode PHP
    <?php

    set_time_limit(0);

    $TEMPLATE_EXT='fods';
    if(trim(strtolower($_SERVER['QUERY_STRING']))=='xls') {$EXTENSION='xls';$CONTENT_TYPE='application/vnd.ms-excel';$CONVERT_TO='xls';}
    else if(trim(strtolower($_SERVER['QUERY_STRING']))=='xlsx') {$EXTENSION='xlsx';$CONTENT_TYPE='application/msexcel';$CONVERT_TO='xlsx';}
    else {$EXTENSION='pdf';$CONTENT_TYPE='application/pdf';$CONVERT_TO='pdf';}

    $NEWLINE='<text:line-break/>';

    $host_libreoffice='127.0.0.1';
    $port_libreoffice='8080';

    $db=mysqli_connect('localhost','root','','employees') or die(mysqli_connect_errno().': '.mysqli_connect_error());

    $template='C:/template/';
    $temp='C:/temp/';

    $unoconv=
    '"C:/Program Files/LibreOffice/program/python.exe" "C:/Program Files/LibreOffice/program/unoconv" '.
    '--connection "socket,host='.$host_libreoffice.',port='.$port_libreoffice.',tcpNoDelay=1;urp;StarOffice.ComponentContext" ';

    $report_time=date('_Ymd_His').sprintf('_%06d',mt_rand(0,999999));

    // nama file output / hasil
    $report_name='list1';

    // ambil isi file template, fods => excel
    $template_doc=file_get_contents($template.'list1-template.'.$TEMPLATE_EXT);
    $template_data=file_get_contents($template.'list1-data.'.$TEMPLATE_EXT);

    // variable template
    $var_doc='{DATA}';
    $var_data=array('{EMP_NO}','{EMP_LASTNAME}','{EMP_FIRSTNAME}','{EMP_GENDER}','{EMP_TITLE}','{EMP_DEPARTMENT}');

    $qry=mysqli_query($db,
    'SELECT
    e.emp_no,
    CONCAT(e.last_name,", ",e.first_name) AS `name`,
    e.last_name,
    e.first_name,
    e.gender,
    GROUP_CONCAT(t.title ORDER BY t.from_date DESC SEPARATOR ",") AS `title`,
    GROUP_CONCAT(d.dept_name ORDER BY de.from_date DESC SEPARATOR ",") AS `dept_name`
    FROM employees e
    LEFT JOIN titles t ON t.emp_no=e.emp_no
    LEFT JOIN dept_emp de ON de.emp_no=e.emp_no
    LEFT JOIN departments d ON d.dept_no=de.dept_no
    GROUP BY `name` ASC'
    ) or die(mysqli_errno($db).': '.mysqli_error($db));

    $DOC='';
    $value_doc='';

    while($rec=(mysqli_fetch_assoc($qry))) {
    $rec['title']=explode(',',$rec['title']);$rec['title']=$rec['title'][0];
    $rec['dept_name']=explode(',',$rec['dept_name']);$rec['dept_name']=$rec['dept_name'][0];

    $value_doc.=
    str_replace(
    $var_data,
    array($rec['emp_no'],$rec['last_name'],$rec['first_name'],$rec['gender'],$rec['title'],$rec['dept_name']),
    $template_data
    );
    }

    $DOC=str_replace($var_doc,$value_doc,$template_doc);
    file_put_contents($temp.$report_name.$report_time.'.'.$TEMPLATE_EXT,$DOC);

    exec(
    $unoconv.
    '-f '.$CONVERT_TO.' '.
    '-o "'.$temp.$report_name.$report_time.'.'.$EXTENSION.'" '.
    '"'.$temp.$report_name.$report_time.'.'.$TEMPLATE_EXT.'"'
    );

    unlink($temp.$report_name.$report_time.'.'.$TEMPLATE_EXT);

    header('Expires: Tue, 1 Jan 1980 00:00:00 GMT');
    header('Cache-Control: no-cache');
    header('Pragma: no-cache');
    header('Content-Disposition: attachment; filename="'.$report_name.$report_time.'.'.$EXTENSION.'"');
    header('Content-Type: '.$CONTENT_TYPE);
    readfile($temp.$report_name.$report_time.'.'.$EXTENSION);

    unlink($temp.$report_name.$report_time.'.'.$EXTENSION);

    ?>

    Koding tidak berubah jauh dari contoh koding yg lain.
    Fungsi script php hanya mengisi data dan menjalankan konversi.

    Cara pemanggilan script sama seperti koding sebelumnya, hanya saja ini utk XLS / XLSX, dapat disertakan parameter ?xls / ?xlsx / ?pdf sesuai dokumen yg dibutuhkan.
    Misal koding disimpan menjadi : php_excel1.php
    http://localhost/php_excel1.php?xlsx ... akan menghasilkan file XLSX

    Hasil

    Catatan :
    Utk dokumen PDF hasil tidak sempurna (terpotong, beda halaman), karena pada saat pembuatan template awal menggunakan Microsoft Excel tidak mengatur "Set Print Area", "Page Width" dan "Page Orientation".

    ▲ Daftar Isi ▲

This discussion has been closed.