گرفتن screenshot از یک لایوت و تبدیل آن به PDF (حل شد) فقط یک نکته!؟
بر روز رسانی :
سلام بچه ها من این سوال رو قبلا به شکل دیگه مطرح کردم که دوستان کمی راهنمایی کردن و خودم خیلی تحقیق کردم و اینکه کدهای زیادی رو تست کردم ولی به نتیجه دلخواه نرسیدم یه بار دیگه توضیح میدم :
من یه لایوت دارم که در دو جهت اسکرول میشه و میخواستم این لایوت رو به pdf تبدیل کنم که به این نتیجه رسیدم که بهتره که اول از صفحه اسکرین شات بگیرم و بعد اونو به pdf تبدیل کنم
باید بگم برای یک لایوت ساده تونستم کد صحیح رو بنویسم ولی برای لایوتی که اسکرول میشه نه !!!
سلام دوستان عزیز من بالاخره با کلی داستان این مشکل رو حل کردم و پاسخ رو برای دوستان میذارم
** البته باید خدمت دوستان عرض کنم که تجربه من میگه که پاسخی که من میگم تنها پاسخ و ترجیحا درست ترین نیست و از دوستانی که به غیر این راه حل ، روش دیگه ای رو می دونن بگن تا بقیه هم بتونن استفاده کنن **
در کد زیر فقط یک مشکل به نظر من هست که اونم خیلی نوشته ها و عکس ها بعد اینکه به PDF تبدیل شدند کیفیت بالایی ندارند و شارپ نمیشن اگه کسی از دوستان بتونه واسه این کار هم راهنمایی کنه به نظرم این تایپیک دیگه کامل میشه ، باید بگم من راجع به همین موضوع هم تحقیق کردم و نتایجی مثل استفاده از ItextSharp رسیدم ولی نتونستم تو برنامه استفاده کنم .
Main Activity :
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.HorizontalScrollView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import com.itextpdf.text.BadElementException;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Date;
public class MainActivity extends AppCompatActivity {
ImageView view;
Bitmap screen;
static Image image ;
LayoutInflater inflater;
private static String FILE ; // add permission in your manifest...
Date now = new Date();
static ScrollView iv;
static HorizontalScrollView ih;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
view = (ImageView) findViewById(R.id.imageView);
inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
iv = (ScrollView) findViewById(R.id.scrollVertical);
ih = (HorizontalScrollView) findViewById(R.id.scrollHorizontal);
android.text.format.DateFormat.format("yyyy-MM-dd_hh:mm:ss", now);
FILE = "mnt/sdcard/"+now+".pdf";
}
public void btnSavePDF(View v) {
try {
LinearLayout root = (LinearLayout) inflater.inflate(R.layout.activity_main, null); //RelativeLayout is root view of my UI(xml) file.
root.setDrawingCacheEnabled(true);
screen = getBitmapFromView(this.getWindow().findViewById(R.id.root));
Document document = new Document(PageSize.A4, 0, 0, 0, 0);
PdfWriter.getInstance(document, new FileOutputStream(FILE));
document.open();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
screen.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
addImage(document, byteArray);
document.close();
view.setImageBitmap(screen);
} catch (Throwable e) {
// Several error may come out with file handling or OOM
e.printStackTrace();
}
}
public static Bitmap getBitmapFromView(View view) {
//Define a bitmap with the same size as the view
Bitmap returnedBitmap = Bitmap.createBitmap(ih.getChildAt(0).getWidth(),
iv.getChildAt(0).getHeight(),
Bitmap.Config.ARGB_8888);
//Bind a canvas to it
Canvas canvas = new Canvas(returnedBitmap);
//Get the view's background
Drawable bgDrawable =view.getBackground();
if (bgDrawable!=null)
//has background drawable, then draw it on the canvas
bgDrawable.draw(canvas);
else
//does not have background drawable, then draw white background on the canvas
canvas.drawColor(Color.WHITE);
// draw the view on the canvas
iv.getChildAt(0).draw(canvas);
ih.getChildAt(0).draw(canvas);
//return the bitmap
return returnedBitmap;
}
private static void addImage(Document document, byte[] byteArray)
{
try
{
image = Image.getInstance(byteArray);
}
catch (BadElementException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (MalformedURLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
//image.scaleAbsolute(150f, 150f);
image.scaleToFit(PageSize.A4);
image.setDpi(300,300);
try
{
document.add(image);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .