【问题标题】:Is it possible to merge pdf files into one with mupdf on android?是否可以将 pdf 文件与 android 上的 mupdf 合并为一个文件?
【发布时间】:2012-11-07 11:53:42
【问题描述】:

我有很多单页 pdf 文件,我想将其合并到一个 pdf 文件中,并在 android 设备上使用 mupdf 库。这可能吗?

如果不可能,你能推荐一些我可以在安卓上使用的东西吗?

注意:所有 pdf 文件都是加密的,生成的 pdf 文件也必须加密。

【问题讨论】:

    标签: android mupdf


    【解决方案1】:

    虽然查看器所基于的 MuPDF 库能够实现这一壮举,但查看器应用程序目前无法合并 PDF 文件。

    我不知道有任何工具可以合并 PDF 文件并在 Android 上运行,尽管我很容易出错。

    关于加密,您必须解密所有输入文件,并将最终文件作为单独的操作进行加密。因此,除了允许您指定多个输入文件的 UI、它们的组合顺序(实际上,可能还有每个页面的使用顺序)之外,您还需要能够指定解密密码和最终加密方法。相当复杂的用户界面。

    【讨论】:

    • 也许我的问题不够清楚,但我想在后台任务中使用 mupdf 库将多个 pdf 合并为一个 pdf。我不需要任何用户界面。
    • 目前图书馆没有任何“固定”的方式来做到这一点。你可以自己做,但这意味着进入 PDF 文件并调用 MuPDF 解析器来完成工作。我不是在这方面提供建议的最佳人选。如果您访问 irc.freenode.net 上的#ghostscript IRC 频道,可以在那里找到 MuPDF 开发人员,他们将能够更好地为您提供建议。
    【解决方案2】:

    我不知道如何为 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。

    【讨论】:

      猜你喜欢
      • 2012-03-27
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 2020-10-10
      • 2013-06-10
      • 1970-01-01
      相关资源
      最近更新 更多