Bir Android uygulamasından PDF Dosyaları oluşturmanın herhangi bir yolu var mı?
Bir Android uygulamasından PDF Dosyaları oluşturmanın herhangi bir yolu var mı?
Yanıtlar:
Biri Android cihazında PDF oluşturmak isterse, bunu şu şekilde yapabilirsiniz:
API seviyesi 19 veya daha yüksek olan cihazlar için geliştirme yapıyorsanız, yerleşik PrintedPdfDocument'i kullanabilirsiniz: http://developer.android.com/reference/android/print/pdf/PrintedPdfDocument.html
// open a new document
PrintedPdfDocument document = new PrintedPdfDocument(context,
printAttributes);
// start a page
Page page = document.startPage(0);
// draw something on the page
View content = getContentView();
content.draw(page.getCanvas());
// finish the page
document.finishPage(page);
. . .
// add more pages
. . .
// write the document content
document.writeTo(getOutputStream());
//close the document
document.close();
Karmaşık özelliklere sahip bir PDF oluşturmanın püf noktası, istenen xml düzeniyle sahte bir etkinlik yapmaktır. Daha sonra bu kukla etkinliği açabilir, programlı olarak bir ekran görüntüsü alabilir ve bu kütüphaneyi kullanarak bu görüntüyü pdf'ye dönüştürebilirsiniz . Elbette kaydırma yapamama, birden fazla sayfa olmaması gibi sınırlamalar var, ancak sınırlı bir uygulama için bu hızlı ve kolaydır. Umarım bu birine yardımcı olur!
Android'de rastgele bir HTML'nin İngilizce olmayan harflerle PDF'ye dönüştürülmesi sorununa tam bir çözüm bulmak kolay değildir. Rus unicode harfleri için test ediyorum.
Üç kitaplık kullanıyoruz:
(1) Jsoup XHTML’ye dönüştürme için (jsoup-1.7.3.jar),
(2) iTextPDF (itextpdf-5.5.0.jar),
(3) XMLWorker (xmlworker-5.5.1.jar).
public boolean createPDF(String rawHTML, String fileName, ContextWrapper context){
final String APPLICATION_PACKAGE_NAME = context.getBaseContext().getPackageName();
File path = new File( Environment.getExternalStorageDirectory(), APPLICATION_PACKAGE_NAME );
if ( !path.exists() ){ path.mkdir(); }
File file = new File(path, fileName);
try{
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
document.open();
// Подготавливаем HTML
String htmlText = Jsoup.clean( rawHTML, Whitelist.relaxed() );
InputStream inputStream = new ByteArrayInputStream( htmlText.getBytes() );
// Печатаем документ PDF
XMLWorkerHelper.getInstance().parseXHtml(writer, document,
inputStream, null, Charset.defaultCharset(), new MyFont());
document.close();
return true;
} catch (FileNotFoundException e) {
e.printStackTrace();
return false;
} catch (DocumentException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
Zor sorun, iTextPDF XMLWorker kitaplığını kullanarak Rusça harfleri PDF'de görüntülemektir. Bunun için kendi FontProvider arayüzü uygulamamızı oluşturmalıyız:
public class MyFont implements FontProvider{
private static final String FONT_PATH = "/system/fonts/DroidSans.ttf";
private static final String FONT_ALIAS = "my_font";
public MyFont(){ FontFactory.register(FONT_PATH, FONT_ALIAS); }
@Override
public Font getFont(String fontname, String encoding, boolean embedded,
float size, int style, BaseColor color){
return FontFactory.getFont(FONT_ALIAS, BaseFont.IDENTITY_H,
BaseFont.EMBEDDED, size, style, color);
}
@Override
public boolean isRegistered(String name) { return name.equals( FONT_ALIAS ); }
}
Burada, sistem klasöründe bulunan standart Android yazı tipi Droid Sans'ı kullanıyoruz:
private static final String FONT_PATH = "/system/fonts/DroidSans.ttf";
Biraz geç ve henüz kendimi henüz test etmedim ama altında başka kütüphane BSD lisansı olan Android PDF Writer .
Güncelleme Kütüphaneyi kendim denedim. Basit pdf nesilleriyle sorunsuz çalışır (metin, çizgi, dikdörtgen, bitmap, yazı tipi eklemek için yöntemler sağlar). Tek sorun, oluşturulan PDF'nin bellekteki bir Dizede saklanmasıdır, bu büyük belgelerde bellek sorunlarına neden olabilir.
PDFJet , herhangi bir temel PDF oluşturma görevini yerine getirebilecek kütüphanelerinin açık kaynaklı bir sürümünü sunar. Tamamen Java tabanlı bir çözümdür ve Android ile uyumlu olduğu belirtilmektedir. Çok pahalı görünmeyen bazı ek özelliklere sahip ticari bir sürüm var.
Geç, ancak taleple alakalı ve umarım yardımcı olur. Harici bir hizmet kullanıyorsanız (CommonsWare tarafından verilen yanıtta önerildiği gibi), Docmosis'in yardımcı olabilecek bir bulut hizmeti vardır - işlemi ağır işlemleri gerçekleştiren bir bulut hizmetine aktarır . Bu yaklaşım bazı durumlarda idealdir, ancak elbette ağ bağlantılı olmaya dayanır.
Ayrıca PoDoFo kitaplığını da kullanabilirsiniz . Temel amaç, LGPL altında yayınlanmasıdır. C ++ ile yazıldığından, NDK kullanarak çapraz derlemelisiniz ve C-tarafı ve Java sarmalayıcısı yazmalısınız. Bazı üçüncü taraf kitaplıkları OpenCV projesinden kullanılabilir . Ayrıca OpenCV projesinde U android.toolchain.cmake
, oluşturmanıza yardımcı olacak dosyayı bulabilir Makefile
.