我一直在开发一个应用程序,该应用程序使用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的大小。