gpt4 book ai didi

Android PdfDocument 文件大小

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:02:36 34 4
gpt4 key购买 nike

我想使用 KitKat 中引入的 PdfDocument android 类从 View 生成 PDF 文件。我设法做到了,到目前为止文件生成正常,最终得到了正确的 PDF。唯一的问题是文件很大,一页就有 12Mb。有没有办法减小文件大小?

我用来生成 PDF 的代码是:

public static File generateDocument(Activity activity, String fileName, ViewGroup container) throws IOException{
File f = new File(activity.getExternalFilesDir(null), fileName);
PdfDocument document = new PdfDocument();
try{
for(int i=0;i<container.getChildCount();i++){
View v = container.getChildAt(i);
PdfDocument.PageInfo.Builder pageBuilder = new PdfDocument.PageInfo.Builder(v.getWidth(), v.getHeight(), i);
Page page = document.startPage(pageBuilder.create());
v.draw(page.getCanvas());
document.finishPage(page);
}

document.writeTo(new FileOutputStream(f));
} finally{
if(document!=null){
document.close();
}
}
return f;
}

最佳答案

万一有人还在寻找解决方案...我正在从事一个从图像生成 PDF 的项目,但对 Android 的 PdfDocument 和第 3 方 生成的文件大小不满意>AndroidPdfWriter APW .

经过一些试验后,我最终使用了 Apache 的 PdfBox ,这给了我一个大约 80K 的 PDF 文件(A4 尺寸和一张 1960x1080 图像),而使用 PdfDocumentAndroidPdfWriter 时通常是 2~3M。

PDDocument document = new PDDocument();
PDPage page = new PDPage(PDRectangle.A4);
document.addPage(page);

// Define a content stream for adding to the PDF
contentStream = new PDPageContentStream(document, page);

Bitmap bimap = _get_your_bitmap_();
// Here you have great control of the compression rate and DPI on your image.
// Update 2017/11/22: The DPI param actually is useless as of current version v1.8.9.1 if you take a look into the source code. Compression rate is enough to achieve a much smaller file size.
PDImageXObject ximage = JPEGFactory.createFromImage(document, bitmap, 0.75, 72);
// You may want to call PDPage.getCropBox() in order to place your image
// somewhere inside this page rect with (x, y) and (width, height).
contentStream.drawImage(ximage, 0, 0);

// Make sure that the content stream is closed:
contentStream.close();

document.save(_your_file_path_);
document.close();

=====

顺便说一句。我猜他们生成巨大文件的原因是因为他们在写入 PDF 文件时不压缩图像数据。如果您查看 AndroidPdfWriter 的 XObjectImage.deflateImageData() 方法,您会看到它使用 java.util.zip.Deflater.NO_COMPRESSION 选项来写入图像数据,如果您有尺寸为 1960x1080 的图片。如果您将选项更改为例如Deflater.BEST_COMPRESSION 你得到的文件要小得多,但我处理一个页面最多需要 3-4 秒,这是 Not Acceptable 。

关于Android PdfDocument 文件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22805726/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com