יצירת קובץ pdf באנדרואיד
-
אני מפתחת אפליקציה באנדרואיד
ואני רוצה לשלוח קובץ pdf מהפליקציה למייל של הלקוח
הצלחתי ליצור את קובץ הpdf
ולשלוח אותו במייל מתוך האפליקציה
אבל הבעיה שלי כשאני מכניסה נתונים לקובץ הוא מזהה רק אנגלית
ואם אני כותבת בעברית אז הוא שם דברים ריקים
השאלה איך אפשר להכניס לו ערכים בעבריתפורסם במקור בפורום CODE613 ב23/02/2014 22:02 (+02:00)
-
זה הקוד של יצירת הקובץ
private void createPdf() { String emailAddress[] = {transaction.getEmail(),company.getMail()}; createPDF(); File externalStorage = Environment.getExternalStorageDirectory(); Uri uri = Uri.fromFile(new File(externalStorage.getAbsolutePath() + "/PDF/okTransaction.pdf")); Intent emailIntent = new Intent(Intent.ACTION_SEND); emailIntent.putExtra(Intent.EXTRA_EMAIL, emailAddress); emailIntent.putExtra(Intent.EXTRA_SUBJECT, "OK Transaction"); emailIntent.putExtra(Intent.EXTRA_TEXT, transaction.getName()); emailIntent.setType("application/pdf"); emailIntent.putExtra(Intent.EXTRA_STREAM, uri ); startActivity(Intent.createChooser(emailIntent, "Send email using:")); } public void createPDF() { Document doc = new Document(); try { String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/PDF"; File dir = new File(path); if(!dir.exists()) dir.mkdirs(); Log.d("PDFCreator", "PDF Path: " + path); File file = new File(dir, "okTransaction.pdf"); FileOutputStream fOut = new FileOutputStream(file); PdfWriter.getInstance(doc, fOut); //open the document doc.open(); /* Create Paragraph and Set Font */ Paragraph p1 = new Paragraph("אישור עסקה"); /* Create Set Font and its Size */ Font paraFont= new Font(Font.HELVETICA); paraFont.setSize(16); p1.setAlignment(Paragraph.ALIGN_CENTER); p1.setFont(paraFont); //add paragraph to document doc.add(p1); Paragraph p2 = new Paragraph(company.getUsername()+","+company.getMerchantNum()); paraFont= new Font(Font.HELVETICA); paraFont.setSize(14); p2.setAlignment(Paragraph.ALIGN_CENTER); p2.setFont(paraFont); doc.add(p2); PdfPTable table=new PdfPTable (2); table.setWidths(new float[]{2.6f, 2.6f}); Font font = new Font(Font.HELVETICA, 14, Font.BOLD, harmony.java.awt.Color.BLACK); PdfPCell cell = new PdfPCell(new Phrase("HMKCODE.com - iText PDFTable Example",font)); cell.setColspan(2); PdfPCell cell1 = new PdfPCell(new Phrase(company.getUsername()+","+company.getMerchantNum(),font)); // Paragraph pp=new Paragraph("מספר קבלה"); // BaseFont unicode = BaseFont.createFont("c:/windows/fonts/arial.ttf", BaseFont.IDENTITY_H , BaseFont.EMBEDDED); // Font fontHebrew = new Font(unicode, 12, Font.NORMAL); // pp.setAlignment(Paragraph.ALIGN_CENTER); // pp.setFont(fontHebrew); // table.addCell(pp); table.addCell("מספר קבלה"); // table.addCell(new String(("מספר קבלה").getBytes(), "UTF-16")); table.addCell("0");//לשנות מספר חשבונית table.addCell("שם הלקוח"); // String data = "\u092a\u093e\u0932\u094d\u092a\u093e\u0915\u093e \u092c\u0928\u094d\u0926\u0940\u0939\u0930\u0942 \u0915\u093e\u0930\u093e\u0917\u093e\u0930\u092d\u093f\u0924\u094d\u0930\u0948 \u0905\u0938\u0941\u0930\u0915"; // byte[] bute = null; // String asd = null; // bute = data.getBytes("מייל"); // try { // asd= new String(bute, "UTF-8"); // // System.out.println(asd); // } catch (UnsupportedEncodingException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // table.addCell(asd); table.addCell(transaction.getName()); table.addCell("mail"); table.addCell(transaction.getEmail()); // table.addCell("טלפון"); table.addCell("phone"); table.addCell(transaction.getPhone()); // table.addCell("כרטיס שמספרו"); table.addCell("Numbered card"); table.addCell((transaction.getCreditNum().substring(transaction.getCreditNum().length()-4))); // table.addCell("חברת האשראי"); table.addCell("Credit card company"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); Bitmap bitmap = null ; switch (transaction.getImgCredit()) { case 1:bitmap = BitmapFactory.decodeResource(getBaseContext().getResources(), R.drawable.isracard);break; case 2:bitmap = BitmapFactory.decodeResource(getBaseContext().getResources(),R.drawable.visa);break; case 3:bitmap = BitmapFactory.decodeResource(getBaseContext().getResources(),R.drawable.diners);break; case 4:bitmap = BitmapFactory.decodeResource(getBaseContext().getResources(),R.drawable.amex);break; case 6:bitmap = BitmapFactory.decodeResource(getBaseContext().getResources(),R.drawable.leumicard);break; default: break; } bitmap.compress(Bitmap.CompressFormat.JPEG, 100 , stream); Image myImg = Image.getInstance(stream.toByteArray()); myImg.setAlignment(Image.MIDDLE); table.addCell(myImg); // table.addCell("סוג עסקה"); table.addCell("Type of transaction"); switch (Integer.parseInt(transaction.getTypeTrans())) { case 01: table.addCell(" Required deal");break; case 51: table.addCell("Right deal");break; // case 01: table.addCell(" עסקת חובה");break; // case 51: table.addCell("עסקת זכות");break; default: break; } // table.addCell("סכום עסקה"); table.addCell("Transaction amount"); table.addCell(transaction.getPrice().toString()); // table.addCell("סוג תשלום"); table.addCell("Type of Payment"); switch (Integer.parseInt(transaction.getTypeCredit())) { // case 1:table.addCell("רגיל");break; // case 6:table.addCell("קרדיט");break; // case 8:table.addCell("תשלומים");break; case 1:table.addCell("Standard");break; case 6:table.addCell("Credit");break; case 8:table.addCell("Payments");break; default: break; } // table.addCell("מספר תשלומים"); table.addCell("Number of payments"); table.addCell(transaction.getNumPayments()+""); // table.addCell("תשלום ראשון"); table.addCell("Downpayment"); table.addCell(transaction.getFirstPay()+""); // table.addCell("חתימה"); table.addCell("Signature"); table.addCell("Signature ccc"); doc.add(table); //set footer } catch (DocumentException de) { Log.e("PDFCreator", "DocumentException:" + de); } catch (IOException e) { Log.e("PDFCreator", "ioException:" + e); } finally { doc.close(); } }
פורסם במקור בפורום CODE613 ב25/02/2014 11:16 (+02:00)
-
לפי מה שמצאתי באינטרנט. המחלקה זה http://itextpdf.com/
יש שם דוגמא איך לעשות שיעבוד unicode.
http://itextpdf.com/examples/iia.php?id=199ראיתי בקוד שניסתם להשתמש עם BaseFont.createFont . אבל לא ברור לי איך יש כתובת כזאת
"c:/windows/fonts/arial.ttf" באנדרואיד.אנדרואיד מבוסס על לינוקס וכל הכתובות שלו מתחילות ב / .אין כזה דבר c:.
לפי מה שמצאתי באינטרנט התקיה ששם נמצא הפונטים באנדרואיד זה./system/fonts
פורסם במקור בפורום CODE613 ב25/02/2014 15:03 (+02:00)
-
אני לא יודע מה המטרה של השליחה של הpdf אבל תשקלו אולי לשלוח ישר בתוך הhtml של המייל את הנתונים. זה לדעתי יותר קל מלבנות pdf וגם אין בעיה שם עם עברית.
זה קבלה, ולא כ"כ פשוט לפי חוקי מס הכנסה ליצור את זה עם HTML, כי אפשר לשנות את הקובץ.
אא"כ ליצור HTML, ואז לסגור את הקובץ לPDF.פורסם במקור בפורום CODE613 ב25/02/2014 16:48 (+02:00)
-
@magicode
אני לא יודע מה המטרה של השליחה של הpdf אבל תשקלו אולי לשלוח ישר בתוך הhtml של המייל את הנתונים. זה לדעתי יותר קל מלבנות pdf וגם אין בעיה שם עם עברית.זה קבלה, ולא כ"כ פשוט לפי חוקי מס הכנסה ליצור את זה עם HTML, כי אפשר לשנות את הקובץ.
אא"כ ליצור HTML, ואז לסגור את הקובץ לPDF.איפה כתובים החוקים האלו. ומה הטעם.
פורסם במקור בפורום CODE613 ב25/02/2014 17:17 (+02:00)
-
ניסיתי כמו שאמרתם באתר http://itextpdf.com
וזה לא עבד לי
מה אפשר לעשות?
זה מאד דחוף לי כי אני צריכה להגיש את הפרוייקט ביום ראשון בבקר
תודה בכל אופן על כל העזרה
צילה :lol:פורסם במקור בפורום CODE613 ב25/02/2014 18:54 (+02:00)
-
ואגב פעם הבאה שאתם שמים קוד.
תבחרו תחביר ככה לדוגמא.
כדי שהקוד יהיה ברור.
private void createPdf() { String emailAddress[] = {transaction.getEmail(),company.getMail()}; createPDF(); File externalStorage = Environment.getExternalStorageDirectory(); Uri uri = Uri.fromFile(new File(externalStorage.getAbsolutePath() + "/PDF/okTransaction.pdf")); Intent emailIntent = new Intent(Intent.ACTION_SEND); emailIntent.putExtra(Intent.EXTRA_EMAIL, emailAddress); emailIntent.putExtra(Intent.EXTRA_SUBJECT, "OK Transaction"); emailIntent.putExtra(Intent.EXTRA_TEXT, transaction.getName()); emailIntent.setType("application/pdf"); emailIntent.putExtra(Intent.EXTRA_STREAM, uri ); startActivity(Intent.createChooser(emailIntent, "Send email using:")); } public void createPDF() { Document doc = new Document(); try { String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/PDF"; File dir = new File(path); if(!dir.exists()) dir.mkdirs(); Log.d("PDFCreator", "PDF Path: " + path); File file = new File(dir, "okTransaction.pdf"); FileOutputStream fOut = new FileOutputStream(file); PdfWriter.getInstance(doc, fOut); //open the document doc.open(); /* Create Paragraph and Set Font */ Paragraph p1 = new Paragraph("אישור עסקה"); /* Create Set Font and its Size */ Font paraFont= new Font(Font.HELVETICA); paraFont.setSize(16); p1.setAlignment(Paragraph.ALIGN_CENTER); p1.setFont(paraFont); //add paragraph to document doc.add(p1); Paragraph p2 = new Paragraph(company.getUsername()+","+company.getMerchantNum()); paraFont= new Font(Font.HELVETICA); paraFont.setSize(14); p2.setAlignment(Paragraph.ALIGN_CENTER); p2.setFont(paraFont); doc.add(p2); PdfPTable table=new PdfPTable (2); table.setWidths(new float[]{2.6f, 2.6f}); Font font = new Font(Font.HELVETICA, 14, Font.BOLD, harmony.java.awt.Color.BLACK); PdfPCell cell = new PdfPCell(new Phrase("HMKCODE.com - iText PDFTable Example",font)); cell.setColspan(2); PdfPCell cell1 = new PdfPCell(new Phrase(company.getUsername()+","+company.getMerchantNum(),font)); // Paragraph pp=new Paragraph("מספר קבלה"); // BaseFont unicode = BaseFont.createFont("c:/windows/fonts/arial.ttf", BaseFont.IDENTITY_H , BaseFont.EMBEDDED); // Font fontHebrew = new Font(unicode, 12, Font.NORMAL); // pp.setAlignment(Paragraph.ALIGN_CENTER); // pp.setFont(fontHebrew); // table.addCell(pp); table.addCell("מספר קבלה"); // table.addCell(new String(("מספר קבלה").getBytes(), "UTF-16")); table.addCell("0");//לשנות מספר חשבונית table.addCell("שם הלקוח"); // String data = "\u092a\u093e\u0932\u094d\u092a\u093e\u0915\u093e \u092c\u0928\u094d\u0926\u0940\u0939\u0930\u0942 \u0915\u093e\u0930\u093e\u0917\u093e\u0930\u092d\u093f\u0924\u094d\u0930\u0948 \u0905\u0938\u0941\u0930\u0915"; // byte[] bute = null; // String asd = null; // bute = data.getBytes("מייל"); // try { // asd= new String(bute, "UTF-8"); // // System.out.println(asd); // } catch (UnsupportedEncodingException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // table.addCell(asd); table.addCell(transaction.getName()); table.addCell("mail"); table.addCell(transaction.getEmail()); // table.addCell("טלפון"); table.addCell("phone"); table.addCell(transaction.getPhone()); // table.addCell("כרטיס שמספרו"); table.addCell("Numbered card"); table.addCell((transaction.getCreditNum().substring(transaction.getCreditNum().length()-4))); // table.addCell("חברת האשראי"); table.addCell("Credit card company"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); Bitmap bitmap = null ; switch (transaction.getImgCredit()) { case 1:bitmap = BitmapFactory.decodeResource(getBaseContext().getResources(), R.drawable.isracard);break; case 2:bitmap = BitmapFactory.decodeResource(getBaseContext().getResources(),R.drawable.visa);break; case 3:bitmap = BitmapFactory.decodeResource(getBaseContext().getResources(),R.drawable.diners);break; case 4:bitmap = BitmapFactory.decodeResource(getBaseContext().getResources(),R.drawable.amex);break; case 6:bitmap = BitmapFactory.decodeResource(getBaseContext().getResources(),R.drawable.leumicard);break; default: break; } bitmap.compress(Bitmap.CompressFormat.JPEG, 100 , stream); Image myImg = Image.getInstance(stream.toByteArray()); myImg.setAlignment(Image.MIDDLE); table.addCell(myImg); // table.addCell("סוג עסקה"); table.addCell("Type of transaction"); switch (Integer.parseInt(transaction.getTypeTrans())) { case 01: table.addCell(" Required deal");break; case 51: table.addCell("Right deal");break; // case 01: table.addCell(" עסקת חובה");break; // case 51: table.addCell("עסקת זכות");break; default: break; } // table.addCell("סכום עסקה"); table.addCell("Transaction amount"); table.addCell(transaction.getPrice().toString()); // table.addCell("סוג תשלום"); table.addCell("Type of Payment"); switch (Integer.parseInt(transaction.getTypeCredit())) { // case 1:table.addCell("רגיל");break; // case 6:table.addCell("קרדיט");break; // case 8:table.addCell("תשלומים");break; case 1:table.addCell("Standard");break; case 6:table.addCell("Credit");break; case 8:table.addCell("Payments");break; default: break; } // table.addCell("מספר תשלומים"); table.addCell("Number of payments"); table.addCell(transaction.getNumPayments()+""); // table.addCell("תשלום ראשון"); table.addCell("Downpayment"); table.addCell(transaction.getFirstPay()+""); // table.addCell("חתימה"); table.addCell("Signature"); table.addCell("Signature ccc"); doc.add(table); //set footer } catch (DocumentException de) { Log.e("PDFCreator", "DocumentException:" + de); } catch (IOException e) { Log.e("PDFCreator", "ioException:" + e); } finally { doc.close(); } }
פורסם במקור בפורום CODE613 ב25/02/2014 19:44 (+02:00)
-
מה זה לא עבד? כל פעם שהיה טקסט בעברית נשאר ריק בקובץ pdf
הייתה שגיאה? לא היתה שום שגיאה
יש לכם פונט בתוך האנדרואיד (לא במחשב הפיתוח) שתומך עברית?
** כן המכשיר פועל על עברית ובכל אופן זה לא עובד**פורסם במקור בפורום CODE613 ב25/02/2014 23:59 (+02:00)
-
תנסו להכניס לכרטיס sd של האנדרואיד. את פונט אריאל.
ולעשות ככה.
BaseFont unicode = BaseFont.createFont(Environment.getExternalStorageDirectory().getAbsolutePath() + "/arial.ttf", BaseFont.IDENTITY_H , BaseFont.EMBEDDED);
תגידו מה יוצא מזה.
פורסם במקור בפורום CODE613 ב26/02/2014 14:44 (+02:00)
-
@ClickOne
@magicode
אני לא יודע מה המטרה של השליחה של הpdf אבל תשקלו אולי לשלוח ישר בתוך הhtml של המייל את הנתונים. זה לדעתי יותר קל מלבנות pdf וגם אין בעיה שם עם עברית.זה קבלה, ולא כ"כ פשוט לפי חוקי מס הכנסה ליצור את זה עם HTML, כי אפשר לשנות את הקובץ.
אא"כ ליצור HTML, ואז לסגור את הקובץ לPDF.איפה כתובים החוקים האלו. ומה הטעם.
חוקי מס הכנסה כתובים כאן והטעם שלא יוכלו לזייף מסמכים. למעשה מס הכנסה לא יודעים שכל קובץ אפשר לשנות, כל ערך במסד נתונים ניתן לשינוי, או שהם בונים על זה שמתכנתים מרוויחים מעט מידי ואין להם זמן לזייף מסמכים :lol: :lol: :lol:
פורסם במקור בפורום CODE613 ב26/02/2014 18:17 (+02:00)
-
חוקי מס הכנסה כתובים כאן והטעם שלא יוכלו לזייף מסמכים. למעשה מס הכנסה לא יודעים שכל קובץ אפשר לשנות, כל ערך במסד נתונים ניתן לשינוי, או שהם בונים על זה שמתכנתים מרוויחים מעט מידי ואין להם זמן לזייף מסמכים :lol: :lol: :lol:
בpdf כנראה יש מנגנון חתימה אלקטרונית מובנה. אולי זה הטעם.
עלה לי רעיון לעשות בhtml תקן של חתימה אלקטורנית על מקטעים
הרי כל מקטע הולך ככה
<html> תוכן</html>
אפשר לעשות מאפיין שיכיל את התוכן של החתימה ב base64 למשל ככה
<html signature="YWRzZ2dycnJycnJycnJycnJycnZhZHNkdmFmZ2hldGh3ZQ==" signature-algorithm="secp256k1"> תוכן </html>
בעצם זה חתימה לתוכן שמכיל ה html
ואם התוכן לא זהה לחתימה אז אפשר לדעת שנעשה שינוי.פורסם במקור בפורום CODE613 ב26/02/2014 18:35 (+02:00)
-
חוקי מס הכנסה כתובים כאן והטעם שלא יוכלו לזייף מסמכים. למעשה מס הכנסה לא יודעים שכל קובץ אפשר לשנות, כל ערך במסד נתונים ניתן לשינוי, או שהם בונים על זה שמתכנתים מרוויחים מעט מידי ואין להם זמן לזייף מסמכים :lol: :lol: :lol:
ארכיטקט כתב נכון מאד שהטעם הוא כדי שלא יוכלו לזייף מסמכים, והטעם המדוייק הוא שזה לא יהיה אפשרי למשתמש הרגיל לשנות את הקבלה אחרי שיצאה.
אז בPDF רגיל המשתמש הרגיל לא יכול לשנות, ק"ו אם תשתמש בחתימה דיגיטלית, שאז משתמשים במפתח פרטי וציבורי,כאשר המפתח הפרטי לא ידוע והוא נשמר בשרת, ואילו הציבורי ידוע לכל, ואכמ"ל.
בDB גם המשתמש הרגיל לא יכול לשנות (כדי לקבל אישור ממס הכנסה על המפתח לדאוג שבאופן רגיל לא תהיה למשתמש אפשרות להגיע לטבלאות ולשנות)
אבל בHTML כל אחד יכול לערוך את הHTML עם וורד, וזה נכנס לתחום האפור (שים לב שנקטתי בכוונה באפור ולא שחור, כי זה נתון לוויכוח) של קובץ בר שינוי בקלות.לגבי הרעיון עם BASE 64, השאלה אם מי שמשנה את התוכן לא ישנה גם את הBASE 64 (וזה באמת כבר לא שייך למשתמש הרגיל, אני דן כאן לגוף העניין של חתימה דיגיטלית בHTML), זה יכול להיות רעיון אדיר, אם נשתמש גם במפתח פרטי וציבורי + הצפנה.
בשולי הדברים רק אציין שמס הכנסה בודק בערך 2 תוכנות כל שנה לעומק, ומחפש בהם את כל הנפילות האפשריות....
ועוד משהו, אכן יש את אחת התוכנות הנפוצות במגזר החרדי, ששואלת לאחר הדפסה של קבלה אם היא הודפסה נכון כדי לשמור על המקור (והכוונה האמיתית בשאלה הזו היא אחרת, ודי למבין)לגבי השאלה המקורית, בהנחה שבאמת מדובר בקבלה (ואני לא נכנס כאן לפיתרון המצויין שמג'יקוד בהיא, אלא לעצם העניין) לא יותר נכון ליצור את הקובץ על השרת ולהביא אותו למכשיר במקום להסתמך על דברים שיעבדו או לא על המכשיר?
פורסם במקור בפורום CODE613 ב04/03/2014 01:12 (+02:00)
-
לגבי הרעיון עם BASE 64, השאלה אם מי שמשנה את התוכן לא ישנה גם את הBASE 64 (וזה באמת כבר לא שייך למשתמש הרגיל, אני דן כאן לגוף העניין של חתימה דיגיטלית בHTML), זה יכול להיות רעיון אדיר, אם נשתמש גם במפתח פרטי וציבורי + הצפנה.
אני דיברתי על חתימה אלקטרונית תראה ששמתי שם גם את סוג האלגוריטם. שזה הכי טוב בחתימה דיגיטלית. זה אותו סוג של חתימה כמו הביטקוין.
למה צריך + הצפנה.אני יודע שרשות המיסים יש להם אפשרות לשלוח אילהם מסמכים חתומים בחתימה דיגיטלית. זה אומר שאתה קונה כרטיס חכם. כמו סים. שיש עליו מפתח פרטי. ואתה נותן את המפתח הציבורי לרשות המיסים. ואז הם יכולים לבדוק שבאמת זה אתה שחתמת על המסמך.
אולי אפשר להרחיב את זה ולעשות שאפשר לחתום על html בשיטה שאני אמרתי. ואז לא יהיו צריכים את הpdf הקניייני :lol: .לגבי השאלה המקורית, בהנחה שבאמת מדובר בקבלה (ואני לא נכנס כאן לפיתרון המצויין שמג'יקוד בהיא, אלא לעצם העניין) לא יותר נכון ליצור את הקובץ על השרת ולהביא אותו למכשיר במקום להסתמך על דברים שיעבדו או לא על המכשיר?
נראה לי שזה פרוייקט גמר. אז אל תשאל שאלות.
פורסם במקור בפורום CODE613 ב04/03/2014 13:27 (+02:00)