使用图像创建PDF,然后使用PDFBox从另一个PDF中提取图像,这太慢了,并且创建的PDF大小比原始PDF大得多

时间:2019-05-05 10:41:36

标签: android pdf pdfbox

我一直在开发一个应用程序,该应用程序使用PDF,然后将其所有图像剥离并存储为位图的ArrayList。然后可以进一步编辑这些位图,然后另存为PDF。当我试图在编辑后将它们另存为PDF时,或者只是不进行编辑时,PDF的大小变为原始PDF大小的十倍,尽管我在不同的线程上进行了每个页面处理,但运行速度仍然很慢。

例如:如果我使用28 MB大小的PDF,则需要大约4分钟的时间才能将它们重新转换为PDF。 PDF中有20张图像,输出的PDF大小大于200 MB。

我正在使用Tom Roush的PDFBox库供Android使用。 Tom Roush PDFBox Repo

这是createPdf()方法:

public void createPdf() {
        document = new PDDocument();

            for(Bitmap image : images)
            {
                PDFPages page=new PDFPages();
                page.execute(image);
            }

    }

asynctask PDFPages类如下:

public class PDFPages extends AsyncTask<Bitmap,Integer,Void>
    {

        @Override
        protected Void doInBackground(Bitmap... voids) {

            try {
                Bitmap image=voids[0];
                PDPage page = new PDPage();
                document.addPage(page);
                // Define a content stream for adding to the PDF
                PDPageContentStream contentStream = new PDPageContentStream(document, page);

                PDImageXObject ximage = LosslessFactory.createFromImage(document, image);

                // Defining and calculating position and scaling variables
                float w = image.getWidth();
                float h = image.getHeight();

                float x_pos = page.getCropBox().getWidth();
                float y_pos = page.getCropBox().getHeight();


                if (w > h) {
                    h = h * (x_pos / w);
                    w = x_pos;
                } else {
                    w = w * (y_pos / h);
                    h = y_pos;
                }

                float x_adjusted = (x_pos - w) / 2;
                float y_adjusted = (y_pos - h) / 2;

                contentStream.drawImage(ximage, x_adjusted, y_adjusted, w, h);

                // Make sure that the content stream is closed:
                contentStream.close();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);

            countPages = countPages + 1;

            if(countPages == images.size()) {
                try {
                    // Save the final pdf document to a file
                    final String path = myDir.getAbsolutePath() + "/Created.pdf";

                    document.save(path);
                    document.close();

                    Toast.makeText(process.this, "PDF successfully written to :" + path, Toast.LENGTH_SHORT).show();
                } catch (Exception e) {
                    e.printStackTrace();
                }

                progressBar.setVisibility(View.INVISIBLE);
                saving.setVisibility(View.INVISIBLE);
                anim.cancel();

            }

        }
    }

从PDF中提取图像的方法如下:


public void createImages()
    {
        try {
            //Loading the pdf file
            PDDocument document = PDDocument.load(file);
            //Getting all the pages in list
            PDPageTree pages= document.getDocumentCatalog().getPages();
            Iterator iter = pages.iterator();

            myDir = new File(root.getAbsolutePath(), "PDF/" + pdfName);
            if (!myDir.exists()) {
                myDir.mkdirs();
            }

            // i used for counting number of images
            i=0;

            while(iter.hasNext())
            {
                PDPage page=(PDPage) iter.next();
                PDResources resources=page.getResources();

                //Tom Roush code that he commented against my issue of not having resources.getImages() method
                for (COSName name : resources.getXObjectNames())
                {
                    PDXObject xobj = resources.getXObject(name);
                    if (xobj instanceof PDImageXObject)
                    {
                        bit = ((PDImageXObject)xobj).getImage();
                        //Image acquired.
                        if(bit != null) {
                            images.add(bit);
                        }
                        i=i+1;
                    }
                }
            }
            if(i == 0)
            {
                Intent intent=new Intent(process.this,MainActivity.class);
                intent.putExtra("images",i);
                startActivity(intent);
            }
            document.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        Log.i("helll","Completed CreateImages()");
    }

images是位图的ArrayList。

输入的PDF是由Cam Scanner(应用)制作的PDF,使用了设备相机拍摄的20张图像。它的大小为27.45 MB,输出的PDF大小为 264.10 MB

我将很快上传PDF。 无法上传的原因:我目前不在工作区,我完全依赖手机的互联网,是的,我住在第三世界国家。因此,只要有不错的互联网连接,我就会将PDF上传到我的Google驱动器中,并在链接中进行编辑。

我想要一些方法来减少输出时间和输出PDF的大小。

0 个答案:

没有答案