Android'de PDF nasıl oluşturulur


Yanıtlar:


115

Bazı telefonlar (Nexus One gibi), önceden yüklenmiş bir Quickoffice sürümüyle gelir, bu nedenle, dosyayı SD karta kaydettikten sonra uygun Amacı göndermek kadar kolay olabilir.

public class OpenPdf extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button button = (Button) findViewById(R.id.OpenPdfButton);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                File file = new File("/sdcard/example.pdf");

                if (file.exists()) {
                    Uri path = Uri.fromFile(file);
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setDataAndType(path, "application/pdf");
                    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

                    try {
                        startActivity(intent);
                    } 
                    catch (ActivityNotFoundException e) {
                        Toast.makeText(OpenPdf.this, 
                            "No Application Available to View PDF", 
                            Toast.LENGTH_SHORT).show();
                    }
                }
            }
        });
    }
}

1
hmm bunu yarın deneyeceğim. bu yüzden bayt akışlarından alacağım onları bir dosya olarak kaydetmem ve sonra bu kodu yapmayı denemem gerekiyor.
Mikey

18
hmm, Android cihazımda QuickOffice kurulu değilse nasıl olur?
Mikey

2
yani? QuickOffice'iniz yoksa ne olur?
Necronet

Telefon hızlı Office yoksa?
Tofeeq Ahmad

6
PDF dosyası doğrudan Sunucudan nasıl açılır? Cihaza kaydettikten sonra açmak yerine.
EnthuDeveloper

16

Pdf dosyasını web görünümünde açın .

public class MyPdfViewActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    WebView mWebView=new WebView(MyPdfViewActivity.this);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.getSettings().setPluginsEnabled(true);
    mWebView.loadUrl("https://docs.google.com/gview?embedded=true&url="+LinkTo);
    setContentView(mWebView);
  }
}

Sanırım bu yalnızca google görüntüleyici bağlantısıyla çalışıyor çünkü yalnızca resim sunuyor. Doğrudan pdf bağlantısı kullanırsak, işe yaramaz. Bu doğru mu ?
Nathan Do

Bu, yerel dosyalar için değil, yalnızca uzak dosyalar için çalışıyor gibi görünüyor.
Alfie Hanssen 13

2
Ya bağlantı değişirse?
Shuhrat Akramov

3
"2 gün boyunca ısrarla test ettikten sonra, Google dokümanlarında, Google Dokümanlar biçiminde olmayan dosyaları görüntülemek veya indirmek için bant genişliği sınırına ulaştığınızı belirten bir hata aldım ..... Bu nedenle güvenilir görünmüyor." stackoverflow.com/questions/2655972/…
Wédney Yuri

9

Android-Lollipop (api 21) yeni bir API sunar: PdfRenderer

Bu API, bir PDF belgesindeki bir sayfadan bir Bitmap oluşturmanıza olanak sağlar.

Kısaca:

  • pdf belgenizden aranabilir bir dosya tanımlayıcı alın:

      ParcelFileDescriptor fd = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)
    
  • PdfRenderer'ı oluşturun

      PdfRenderer renderer = new PdfRenderer(fd);
    
  • Bitmap'i hazırla

      Bitmap bitmap = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_4444);
    
  • işlemek için PdfRenderer.Page'i edinin

      PdfRenderer.Page page = renderer.openPage(pageIndex);
    
  • sayfayı hazırlanmış bitmap üzerinde işle

      page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
    
  • artık bitmap ile istediğinizi yapabilirsiniz.

  • 2 boş bağımsız değişkenin, sayfanın bir bölümünü kırpmanıza ve klibin bir dönüşümünü ( Matrix kullanarak ) gerçekleştirmenize izin verebileceğini unutmayın.

  • başka bir oluşturma modu var: RENDER_MODE_FOR_PRINT . Bu moda ihtiyacınız varsa, onu doğru kullanmak için bazı yönergeler vardır: ayrıntılar burada .


3
Dosyayı telefona kaydetmeden bunu başarmanın bir yolu var mı? PDF'yi bytestream olarak alıyorum ve telefona kaydetmeden kullanıcıya göstermem gerekiyor.
Gökhan Arık

kısıtlama, kurucuya aranabilir bir dosya tanımlayıcısının iletilmesidir; ve bir soket akışından gelen fd aranamaz. Akıştaki tüm baytları bir arabellekte depolamayı deneyebilir ve bundan aranabilir bir fd elde edebilirsiniz.
ben75

5

Bu kitaplık basit ve iyi çalışıyor: Android Pdf Görüntüleyici https://github.com/barteksc/AndroidPdfViewer

Eski Cevap ...

Joan Zapata'nın bize daha iyi ve basit bir çözüm verdiğini düşünüyorum:

https://github.com/JoanZapata/android-pdfview

Sizi temin ederim ki işe yarıyor!

1 : https://github.com/JoanZapata/android-pdfview


1
Alecs: pdfName için ne kullandınız pdfView.fromAsset(pdfName)? Mutlak yolu kullanmayı denedim, ancak dosya bulunamadı (ve orada olduğundan eminim). Örnek: /data/data/package.name/files/images/filename.pdf
h-bomb

1
Sevgili @ h-bomb, pdf'niz projenizin varlık kaynağı olduğunda fromasset yöntemini kullanmanız gerekir . Cihazdan pdf yüklemek için fromFile yöntemini kullanabilirsiniz .
Alecs

1
Çok teşekkürler. Android'in FileProvider'ını kullanmaya ve harici bir uygulamanın PDF'yi açmasına izin vermeye karar verdim . Şaşırtıcı bir şekilde, FileProvider geliştirme belgesindeki belgeler ve örnek kod mükemmeldi.
h-bomb

3

Yerel pdf dosyaları için, bunları üçüncü taraf kitaplıkları aracılığıyla işleyebilirsiniz. örneğin MuPDF kitaplığını kullanın desteklenen dosya türleri arasında PDF, PNG ve JPEG bulunur.

MuPDF'nin bir dezavantajı, hedefi gerçekleştirmek için yerel kitaplığı kullanmasıdır, bu nedenle uygulamayı daha sonra BlackBerry platformuna taşımak kolay olmayacaktır.


0

Bir bayt dizisinden bir pdf açmak için kullanabilirsiniz RadaeePDF, aktivitenize aşağıdakileri yapabilirsiniz:

private PDFReader m_vPDF = null;
private Document doc = new Document();

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    Global.Init(this);

    m_vPDF = new PDFReader(this);
    doc.Close();

    int ret = m_doc.OpenMem(data, password);
        switch( ret )
        {
            case -1://need input password
                finish();
                break;
            case -2://unknown encryption
                finish();
                break;
            case -3://damaged or invalid format
                finish();
                break;
            case -10://access denied or invalid file path
                finish();
                break;
            case 0://succeeded, and continue
                break;
            default://unknown error
                finish();
                break;
        }

    m_vPDF.open(doc);

    setContentView( m_vPDF );
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.