web-dev-qa-db-ja.com

AndroidアプリでPDFを作成する方法は?

PDFアプリケーションからAndroidファイルを作成する方法はありますか?

138
user299908

誰かがAndroidデバイスでPDFを生成したい場合、その方法は次のとおりです。

151
nikib3ro

APIレベル19以上のデバイス用に開発している場合は、組み込みのPrintedPdfDocumentを使用できます。 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();
92
teh.fonsi

複雑な機能でPDFを作成するコツは、目的のxmlレイアウトでダミーアクティビティを作成することです。その後、このダミーアクティビティを開き、 プログラムでスクリーンショット を取得し、 this library を使用してその画像をpdfに変換できます。もちろん、スクロールできない、1ページを超えないなどの制限がありますが、限られたアプリケーションではこれは迅速かつ簡単です。これが誰かを助けることを願っています!

24
hrishitiwari

Androidで任意のHTMLをPDFに英語以外の文字で変換する問題の完全な解決策を見つけることは容易ではありません。ロシアのユニコード文字をテストします。

3つのライブラリを使用します。

(1) Jsoup (jsoup-1.7.3.jar)HTMLからXHTMLへの変換の場合、

(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;
    } 

難しい問題は、iTextPDF XMLWorkerライブラリを使用してロシア文字をPDFに表示することです。このために、FontProviderインターフェイスの独自の実装を作成する必要があります。

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 ); }
}

ここでは、システムフォルダーにある標準のAndroidフォントDroid Sansを使用します。

private static final String FONT_PATH = "/system/fonts/DroidSans.ttf";
9
DenisMath

少し遅れて、まだ自分でテストしていませんが、 BSDライセンス にある別のライブラリは Android PDF Writer です。

Update自分でライブラリを試しました。簡単なpdf生成で問題なく動作します(テキスト、線、長方形、ビットマップ、フォントを追加するメソッドを提供します)。唯一の問題は、生成されたPDFがメモリ内の文字列に保存されることです。これにより、大きなドキュメントでメモリの問題が発生する可能性があります。

6
Angelo

PDFJet は、基本的なPDF生成タスクを処理できるライブラリのオープンソースバージョンを提供します。これは純粋にJavaベースのソリューションであり、Androidと互換性があるとされています。あまり高価ではないと思われるいくつかの追加機能を備えた商用バージョンがあります。

3
IcedDante

Uは PoDoFo ライブラリも使用できます。主な目標は、LGPLの下で公開することです。 C++で記述されているため、NDKを使用してクロスコンパイルし、CサイドとJavaラッパーを記述する必要があります。一部のサードパーティライブラリは、 OpenCV プロジェクトから使用できます。また、OpenCVプロジェクトUではAndroid.toolchain.cmakeファイルを見つけることができます。これはMakefileの生成に役立ちます。

0
Johnny Doe

遅いが、リクエストに関連し、うまくいけば役立つ。外部サービスを使用する場合(CommonsWareの回答で提案されているように)、 Docmosis には役立つクラウドサービスがあります-処理を重い処理を行うクラウドサービスにオフロードします。このアプローチは状況によっては理想的ですが、もちろんネット接続されていることに依存しています。

0
Paul Jowett