AndroidアプリでPDFを作成する方法は?[閉まっている]


147

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


6
AndroidのイメージングモデルがQtからインスピレーションを得たとしたら、すばらしいと思いませんか。Qtは、PDFまたはSVGの生成は、画面に描画するために使用するのと同じコードをリダイレクトするのと同じくらい簡単であることを確立しました。パターンについては、QPaintDeviceからのQPrinter、QSvgGenerator、およびQWidgetの派生を見てください。
Calaf 2013

1
iOSでも同じです。PDF生成が組み込まれています。
Fabian Zeindl 2013年

2
キットカットにはPDFを生成する機能があると思いますが、これに下位互換性があるかどうかはわかりません。私は、下記のオプションを掲載している商用の自由の範囲で、以下のサイトリストいくつかのオプション:stefan.fenz.at/creating-pdfs-on-android-an-evaluation
IcedD​​ante

5
これが「オフトピック」としてクローズされたことはばかげています。
Joe Coder

2
なぜこの投稿は閉じられたのですか?Stackoverflowはそのスコープについて非常にうるさいです。この質問は175,000のビューを持っています。このサイトはこのようなハイパーコモンなものを許可するコーディングリソースであるため、ルールを修正する必要があります。ルールの中心ではなく、「オフトピック」のリテラルテキストを読みすぎています。再開のフラグを立てました。他の人にも投票してほしいと思います。
Albert Renshaw

回答:


155

AndroidデバイスでPDFを生成したい場合は、次の手順に従ってください。


54
iTextの唯一の問題は、GPLv3ライセンスであること、または商用ライセンスを購入する必要があることです。
トニー・マロ

5
以前のバージョンのiTextには、dalvikがサポートしていないjava.awt.Colorのようないくつかの欠けている依存関係があります
k-deux

3
@ kape123ユーモアのセンス:-)
AZ_

10
CommonsWareの一般的な敗北主義者の回答...
moonlightcheese

2
商用ライセンスは、Androidデバイスあたり約0.50米ドル(0,42 EUR)かかります。(2013年
Chris623 2013年

104

:あなたは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();

2
最後に、iOSの一部としてのAndroidの一部です。
lalitm 2014年

5
@ Chris623私はあなたが「KitKat」を意味していたと思います... :)
アンドロイド開発者

7
@lalitm iOSの場合とは異なります。iOSで生成されたPDFには、ドキュメントで書かれた選択可能なテキストがあります。しかし、アンドロイドではその画像。
Kantesh 2014年

2
@WillThomsonあなたのGitHubリンクはこれか他の何かであるはずでしたか?
jk7


27

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


2
それは少なくとも1upに値する。
Rahul Rastogi、2015年

私のために働いた。シンプルな実装でした。
TharakaNirmana

それはクールな回避策です
Kumar Saurabh

このコメントは私を正しい方向に向けています。ただし:1.スクリーンショットを取るためにアクティビティを開始する必要はありません。実行時にxmlレイアウトを膨らませて、ここで提案されているようにビットマップに変換できます。そうは言っても、レイアウトが異なる複数のページを生成できます。言われているようにスクロールはサポートされていませんが、たとえば線形レイアウトを使用してリストを実装できます。
r.pedrosa 2017

11

Androidで英語以外の文字を使用して任意のHTMLをPDFに変換する問題の完全な解決策を見つけるのは簡単ではありません。ロシア語のUnicode文字をテストします。

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";

1
共有してくれてありがとう!質問があります:HTMLにCSSルールを適用できますか?
プオン2015年

6

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

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


Android PDF Writerでできないこと、「itext」でできることを誰かに教えてもらえますか?
M.ウスマンカーン

1
維持されません!! 最終更新日:
2015

2

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


4
オープンソースではなくなりました
Joshy Francis

0

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


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.