私は多くの 1 ページの pdf ファイルを持っており、Android デバイスの mupdf ライブラリを使用して 1 つの pdf ファイルにマージしたいと考えています。これは可能ですか?
それが不可能な場合は、Android で使用できる他のものをお勧めできますか?
注: すべての pdf ファイルは暗号化されており、結果の pdf ファイルも暗号化する必要があります。
ビューアのベースとなっている MuPDF ライブラリはこのような機能を備えていますが、ビューア アプリケーションは現在 PDF ファイルを結合できません。
PDF ファイルを結合して Android で実行するツールを私は知りませんが、簡単に間違っている可能性があります。
暗号化に関しては、すべての入力ファイルを復号化し、最終ファイルを個別の操作として暗号化する必要があります。したがって、複数の入力ファイルを指定できる UI に加えて、それらを結合する順序 (実際には、それぞれのページを使用する順序も潜在的に) を指定できる必要があります。復号化のためのパスワードと最終的な暗号化方法を指定します。非常に複雑な UI。
MuPDF でこれを行う方法はわかりませんが、Android 上の複数の PDF ファイルを最新のApache PdfBox Releaseと組み合わせることができます。(現時点ではまだ最終ではありません... RC3...)
この依存関係を build.gradle に追加するだけです:
compile 'org.apache.pdfbox:pdfbox:2.0.0-RC3'
そして、非同期タスクでこれを行います:
private File downloadAndCombinePDFs(String urlToPdf1, String urlToPdf2, String urlToPdf3 ) throws IOException {
PDFMergerUtility ut = new PDFMergerUtility();
ut.addSource(NetworkUtils.downloadFile(urlToPdf1, 20));
ut.addSource(NetworkUtils.downloadFile(urlToPdf2, 20));
ut.addSource(NetworkUtils.downloadFile(urlToPdf3, 20));
final File file = new File(getContext().getExternalCacheDir(), System.currentTimeMillis() + ".pdf");
final FileOutputStream fileOutputStream = new FileOutputStream(file);
try {
ut.setDestinationStream(fileOutputStream);
ut.mergeDocuments(MemoryUsageSetting.setupTempFileOnly());
} finally {
fileOutputStream.close();
}
return file;
}
ここで NetworkUtils.downloadFile() は InputStream を返す必要があります。それらがSDカードにある場合は、FileInputStreamを開くことができます。
次のようにインターネットからPDFをダウンロードします。
public static InputStream downloadFileThrowing(String url, int timeOutInSeconds) throws IOException {
OkHttpClient client = new OkHttpClient();
client.setConnectTimeout(timeOutInSeconds, TimeUnit.SECONDS);
client.setReadTimeout(timeOutInSeconds, TimeUnit.SECONDS);
Request request = new Request.Builder().url(url).build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful())
throw new IOException("Download not successful.response:" + response);
else
return response.body().byteStream();
}
OkHttpClient を使用するには、これを build.gradle に追加します。
compile 'com.squareup.okhttp:okhttp:2.7.2'
注: これは、暗号化されたファイルでは機能しません。暗号化されたファイルを結合するには、最初にすべての単一ファイルを復号化し、後で結合された pdf を暗号化する必要があります。