├── .gitignore ├── PDFreport ├── PDF report.iml ├── app │ ├── app.iml │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── azhar │ │ │ └── pdfreport │ │ │ └── ExampleInstrumentedTest.java │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── azhar │ │ │ │ └── pdfreport │ │ │ │ └── MainActivity.java │ │ └── res │ │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── drawable-xxxhdpi │ │ │ └── cup.png │ │ │ ├── drawable │ │ │ ├── bg_button_primary.xml │ │ │ ├── bg_cover.jpg │ │ │ ├── bg_shape.xml │ │ │ ├── ic_launcher_background.xml │ │ │ └── wave_header.xml │ │ │ ├── layout │ │ │ └── activity_main.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── azhar │ │ └── pdfreport │ │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── local.properties └── settings.gradle └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled class file 2 | *.class 3 | 4 | # Log file 5 | *.log 6 | 7 | # BlueJ files 8 | *.ctxt 9 | 10 | # Mobile Tools for Java (J2ME) 11 | .mtj.tmp/ 12 | 13 | # Package Files # 14 | *.jar 15 | *.war 16 | *.nar 17 | *.ear 18 | *.zip 19 | *.tar.gz 20 | *.rar 21 | 22 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 23 | hs_err_pid* 24 | -------------------------------------------------------------------------------- /PDFreport/PDF report.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /PDFreport/app/app.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 10 | 11 | 12 | 13 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | -------------------------------------------------------------------------------- /PDFreport/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 29 5 | buildToolsVersion "29.0.3" 6 | defaultConfig { 7 | applicationId "com.azhar.pdfreport" 8 | minSdkVersion 21 9 | targetSdkVersion 29 10 | versionCode 1 11 | versionName "1.0" 12 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | implementation fileTree(dir: 'libs', include: ['*.jar']) 24 | implementation 'androidx.appcompat:appcompat:1.1.0' 25 | implementation 'androidx.cardview:cardview:1.0.0' 26 | implementation 'androidx.constraintlayout:constraintlayout:1.1.3' 27 | testImplementation 'junit:junit:4.13' 28 | androidTestImplementation 'androidx.test:runner:1.2.0' 29 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' 30 | 31 | implementation 'com.google.android.material:material:1.1.0' 32 | } 33 | -------------------------------------------------------------------------------- /PDFreport/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /PDFreport/app/src/androidTest/java/com/azhar/pdfreport/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.azhar.pdfreport; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.test.platform.app.InstrumentationRegistry; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | import static org.junit.Assert.*; 12 | 13 | /** 14 | * Instrumented test, which will execute on an Android device. 15 | * 16 | * @see Testing documentation 17 | */ 18 | @RunWith(AndroidJUnit4.class) 19 | public class ExampleInstrumentedTest { 20 | @Test 21 | public void useAppContext() { 22 | // Context of the app under test. 23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 24 | 25 | assertEquals("com.azhar.pdfreport", appContext.getPackageName()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /PDFreport/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 16 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /PDFreport/app/src/main/java/com/azhar/pdfreport/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.azhar.pdfreport; 2 | 3 | import androidx.appcompat.app.AppCompatActivity; 4 | import androidx.core.app.ActivityCompat; 5 | 6 | import android.Manifest; 7 | import android.annotation.SuppressLint; 8 | import android.content.pm.PackageManager; 9 | import android.graphics.Bitmap; 10 | import android.graphics.BitmapFactory; 11 | import android.graphics.Canvas; 12 | import android.graphics.Color; 13 | import android.graphics.Paint; 14 | import android.graphics.Typeface; 15 | import android.graphics.pdf.PdfDocument; 16 | import android.os.Bundle; 17 | import android.os.Environment; 18 | import android.view.View; 19 | import android.widget.Button; 20 | import android.widget.EditText; 21 | import android.widget.Spinner; 22 | import android.widget.Toast; 23 | 24 | import java.io.File; 25 | import java.io.FileOutputStream; 26 | import java.io.IOException; 27 | import java.text.DateFormat; 28 | import java.text.SimpleDateFormat; 29 | import java.util.Date; 30 | 31 | public class MainActivity extends AppCompatActivity { 32 | 33 | EditText etName, etNoTlp, etJmlOne, etJmlTwo; 34 | Spinner itemSpinnerOne, itemSpinnerTwo; 35 | Button btnPrint; 36 | Bitmap bitmap, scaleBitmap; 37 | int pageWidth = 1200; 38 | Date dateTime; 39 | DateFormat dateFormat; 40 | float[] harga = new float[]{0, 21000, 22000, 25000, 22500, 21500}; 41 | 42 | @Override 43 | protected void onCreate(Bundle savedInstanceState) { 44 | super.onCreate(savedInstanceState); 45 | setContentView(R.layout.activity_main); 46 | 47 | etName = findViewById(R.id.etName); 48 | etNoTlp = findViewById(R.id.etNoTlp); 49 | etJmlOne = findViewById(R.id.etJmlOne); 50 | etJmlTwo = findViewById(R.id.etJmlTwo); 51 | itemSpinnerOne = findViewById(R.id.itemSpinnerOne); 52 | itemSpinnerTwo = findViewById(R.id.itemSpinnerTwo); 53 | btnPrint = findViewById(R.id.btnPrint); 54 | 55 | //cover header 56 | bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bg_cover); 57 | scaleBitmap = Bitmap.createScaledBitmap(bitmap, 1200, 518, false); 58 | 59 | //permission 60 | ActivityCompat.requestPermissions(this, new String[]{ 61 | Manifest.permission.WRITE_EXTERNAL_STORAGE}, PackageManager.PERMISSION_GRANTED); 62 | 63 | createPDF(); 64 | } 65 | 66 | private void createPDF() { 67 | btnPrint.setOnClickListener(new View.OnClickListener() { 68 | @SuppressLint("SimpleDateFormat") 69 | @Override 70 | public void onClick(View v) { 71 | 72 | dateTime = new Date(); 73 | 74 | //get input 75 | if (etName.getText().toString().length() == 0 || 76 | etNoTlp.getText().toString().length() == 0 || 77 | etJmlOne.getText().toString().length() == 0 || 78 | etJmlTwo.getText().toString().length() == 0) { 79 | Toast.makeText(MainActivity.this, "Data tidak boleh kosong!", Toast.LENGTH_LONG).show(); 80 | } else { 81 | 82 | PdfDocument pdfDocument = new PdfDocument(); 83 | Paint paint = new Paint(); 84 | Paint titlePaint = new Paint(); 85 | 86 | PdfDocument.PageInfo pageInfo 87 | = new PdfDocument.PageInfo.Builder(1200, 2010, 1).create(); 88 | PdfDocument.Page page = pdfDocument.startPage(pageInfo); 89 | 90 | Canvas canvas = page.getCanvas(); 91 | canvas.drawBitmap(scaleBitmap, 0, 0, paint); 92 | 93 | paint.setColor(Color.WHITE); 94 | paint.setTextSize(30f); 95 | paint.setTextAlign(Paint.Align.RIGHT); 96 | canvas.drawText("Berbagai macam jenis Kopi", 1160, 40, paint); 97 | canvas.drawText("Pesan di : 08123456789", 1160, 80, paint); 98 | 99 | titlePaint.setTextAlign(Paint.Align.CENTER); 100 | titlePaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD)); 101 | titlePaint.setColor(Color.WHITE); 102 | titlePaint.setTextSize(70); 103 | canvas.drawText("Tagihan Anda", pageWidth / 2, 500, titlePaint); 104 | 105 | paint.setTextAlign(Paint.Align.LEFT); 106 | paint.setColor(Color.BLACK); 107 | paint.setTextSize(35f); 108 | canvas.drawText("Nama Pemesan: " + etName.getText(), 20, 590, paint); 109 | canvas.drawText("Nomor Tlp: " + etNoTlp.getText(), 20, 640, paint); 110 | 111 | paint.setTextAlign(Paint.Align.RIGHT); 112 | canvas.drawText("No. Pesanan: " + "232425", pageWidth - 20, 590, paint); 113 | 114 | dateFormat = new SimpleDateFormat("dd/MM/yy"); 115 | canvas.drawText("Tanggal: " + dateFormat.format(dateTime), pageWidth - 20, 640, paint); 116 | 117 | dateFormat = new SimpleDateFormat("HH:mm:ss"); 118 | canvas.drawText("Pukul: " + dateFormat.format(dateTime), pageWidth - 20, 690, paint); 119 | 120 | paint.setStyle(Paint.Style.STROKE); 121 | paint.setStrokeWidth(2); 122 | canvas.drawRect(20, 780, pageWidth - 20, 860, paint); 123 | 124 | paint.setTextAlign(Paint.Align.LEFT); 125 | paint.setStyle(Paint.Style.FILL); 126 | canvas.drawText("No.", 40, 830, paint); 127 | canvas.drawText("Menu Pesanan", 200, 830, paint); 128 | canvas.drawText("Harga", 700, 830, paint); 129 | canvas.drawText("Jumlah", 900, 830, paint); 130 | canvas.drawText("Total", 1050, 830, paint); 131 | 132 | canvas.drawLine(180, 790, 180, 840, paint); 133 | canvas.drawLine(680, 790, 680, 840, paint); 134 | canvas.drawLine(880, 790, 880, 840, paint); 135 | canvas.drawLine(1030, 790, 1030, 840, paint); 136 | 137 | float totalOne = 0, totalTwo = 0; 138 | if (itemSpinnerOne.getSelectedItemPosition() != 0) { 139 | canvas.drawText("1.", 40, 950, paint); 140 | canvas.drawText(itemSpinnerOne.getSelectedItem().toString(), 200, 950, paint); 141 | canvas.drawText(String.valueOf(harga[itemSpinnerOne.getSelectedItemPosition()]), 700, 950, paint); 142 | canvas.drawText(etJmlOne.getText().toString(), 900, 950, paint); 143 | totalOne = Float.parseFloat(etJmlOne.getText().toString()) * harga[itemSpinnerOne.getSelectedItemPosition()]; 144 | paint.setTextAlign(Paint.Align.RIGHT); 145 | canvas.drawText(String.valueOf(totalOne), pageWidth - 40, 950, paint); 146 | paint.setTextAlign(Paint.Align.LEFT); 147 | } 148 | 149 | if (itemSpinnerTwo.getSelectedItemPosition() != 0) { 150 | canvas.drawText("2.", 40, 1050, paint); 151 | canvas.drawText(itemSpinnerTwo.getSelectedItem().toString(), 200, 1050, paint); 152 | canvas.drawText(String.valueOf(harga[itemSpinnerTwo.getSelectedItemPosition()]), 700, 1050, paint); 153 | canvas.drawText(etJmlTwo.getText().toString(), 900, 1050, paint); 154 | totalTwo = Float.parseFloat(etJmlTwo.getText().toString()) * harga[itemSpinnerTwo.getSelectedItemPosition()]; 155 | paint.setTextAlign(Paint.Align.RIGHT); 156 | canvas.drawText(String.valueOf(totalTwo), pageWidth - 40, 1050, paint); 157 | paint.setTextAlign(Paint.Align.LEFT); 158 | } 159 | 160 | float subTotal = totalOne + totalTwo; 161 | canvas.drawLine(400, 1200, pageWidth - 20, 1200, paint); 162 | canvas.drawText("Sub Total", 700, 1250, paint); 163 | canvas.drawText(":", 900, 1250, paint); 164 | paint.setTextAlign(Paint.Align.RIGHT); 165 | canvas.drawText(String.valueOf(subTotal), pageWidth - 40, 1250, paint); 166 | 167 | paint.setTextAlign(Paint.Align.LEFT); 168 | canvas.drawText("PPN (10%)", 700, 1300, paint); 169 | canvas.drawText(":", 900, 1300, paint); 170 | paint.setTextAlign(Paint.Align.RIGHT); 171 | canvas.drawText(String.valueOf(subTotal * 10 / 100), pageWidth - 40, 1300, paint); 172 | paint.setTextAlign(Paint.Align.LEFT); 173 | 174 | paint.setColor(Color.rgb(247, 147, 30)); 175 | canvas.drawRect(680, 1350, pageWidth - 20, 1450, paint); 176 | 177 | paint.setColor(Color.BLACK); 178 | paint.setTextSize(50f); 179 | paint.setTextAlign(Paint.Align.LEFT); 180 | canvas.drawText("Total", 700, 1415, paint); 181 | paint.setTextAlign(Paint.Align.RIGHT); 182 | canvas.drawText(String.valueOf(subTotal + (subTotal * 10 / 100)), pageWidth - 40, 1415, paint); 183 | 184 | pdfDocument.finishPage(page); 185 | 186 | File file = new File(Environment.getExternalStorageDirectory(), "/Pesanan.pdf"); 187 | try { 188 | pdfDocument.writeTo(new FileOutputStream(file)); 189 | } catch (IOException e) { 190 | e.printStackTrace(); 191 | } 192 | 193 | pdfDocument.close(); 194 | Toast.makeText(MainActivity.this, "PDF sudah dibuat", Toast.LENGTH_LONG).show(); 195 | } 196 | } 197 | }); 198 | } 199 | } 200 | -------------------------------------------------------------------------------- /PDFreport/app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /PDFreport/app/src/main/res/drawable-xxxhdpi/cup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AzharRivaldi/PDF-Report/f37a5bd679a5afb7bc9b604df05a4fe28bdde8cf/PDFreport/app/src/main/res/drawable-xxxhdpi/cup.png -------------------------------------------------------------------------------- /PDFreport/app/src/main/res/drawable/bg_button_primary.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /PDFreport/app/src/main/res/drawable/bg_cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AzharRivaldi/PDF-Report/f37a5bd679a5afb7bc9b604df05a4fe28bdde8cf/PDFreport/app/src/main/res/drawable/bg_cover.jpg -------------------------------------------------------------------------------- /PDFreport/app/src/main/res/drawable/bg_shape.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 10 | 13 | -------------------------------------------------------------------------------- /PDFreport/app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /PDFreport/app/src/main/res/drawable/wave_header.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /PDFreport/app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | 17 | 18 | 22 | 23 | 24 | 25 | 26 | 27 | 34 | 35 | 45 | 46 | 51 | 52 | 56 | 57 | 63 | 64 | 69 | 70 | 73 | 74 | 82 | 83 | 84 | 85 | 88 | 89 | 97 | 98 | 99 | 100 | 103 | 104 | 111 | 112 | 122 | 123 | 124 | 125 | 128 | 129 | 136 | 137 | 147 | 148 | 149 | 150 |