如何在 Android 上使用 PdfDocument 设置 PDF 文件大小

Posted

技术标签:

【中文标题】如何在 Android 上使用 PdfDocument 设置 PDF 文件大小【英文标题】:How to set PDF file size using PdfDocument on Android 【发布时间】:2015-03-12 13:16:10 【问题描述】:

我必须在 android 上将一些文本和一个小图像转换为 PDF 文档,为此我使用 API 19 中添加的PdfDocument

问题在于,这个生成的 PDF 大约是 ios 上生成的 PDF 的 3 倍(文件大小)。

另外,我尝试使用在线免费压缩工具压缩 Android 和 iOS PDF 文件,结果是:

iOS:压缩无法执行任何操作,因为已经压缩得足够了

Android:生成的 PDF 与 iOS 相同(大约小 3 倍)

即使我从文档中删除了图像,生成的 Android PDF 所占用的空间也比 iOS 中包含图像的 PDF 多 2 倍(正如我所说,图像很小)..

正如我所见,没有设置方法或属性来更改 PDF 文件的质量或压缩率。有没有人也有这个问题?

你能给我一些建议吗?也许一些可以压缩pdf的java库?

谢谢!

PS:我不想为 PDF 使用付费库,我知道有 iText 库,但我想使用原生库。

更新

Here 您会找到两个 PDF 示例,一个用于 Android,一个用于 iOS。

android中用来生成pdf的代码是:

// Create a shiny new (but blank) PDF document in memory
            PdfDocument document = new PdfDocument();

            // crate a page description
            PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(612, 792, 1).create();

            // create a new page from the PageInfo
            PdfDocument.Page page = document.startPage(pageInfo);

            TextPaint textPaint = new TextPaint();
            textPaint.setColor(Color.BLACK);
            textPaint.setTextSize(12);
            textPaint.setTextAlign(Paint.Align.LEFT);

            Typeface textTypeface = Typeface.create(Typeface.MONOSPACE, Typeface.NORMAL);
            textPaint.setTypeface(textTypeface);

            String text = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Typi non habent claritatem insitam; est usus legentis in iis qui facit eorum claritatem. Investigationes demonstraverunt lectores legere me lius quod ii legunt saepius. Claritas est etiam processus dynamicus, qui sequitur mutationem consuetudium lectorum. Mirum est notare quam littera gothica, quam nunc putamus parum claram, anteposuerit litterarum formas humanitatis per seacula quarta decima et quinta decima. Eodem modo typi, qui nunc nobis videntur parum clari, fiant sollemnes in futurum.";

            StaticLayout mTextLayout = new StaticLayout(text, textPaint, page.getCanvas().getWidth(),
                    Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);

            mTextLayout.draw(page.getCanvas());

            // do final processing of the page
            document.finishPage(page);

            mPDFFilePath = new File(getFilesDir(), "demo_android.pdf");

            try
            
                FileOutputStream mFileOutStream = new FileOutputStream(mPDFFilePath);

                // write the document content
                document.writeTo(mFileOutStream);
                mFileOutStream.flush();
                mFileOutStream.close();

            
            catch(Exception e)
            
                Log.v("log_tag", e.toString());
            

            //close the document
            document.close();

再次感谢!

【问题讨论】:

请分享一对 PDF 样本(内容相同但大小不同)以供分析。 @mkl 谢谢,我刚刚更新了我的帖子! 看样本大的主要原因是Android生成的aPDF页面内容流没有被压缩和Android中的b文本内容流是逐字母绘制的,文本矩阵在每个字母之前再次显式设置。对于问题 a,您可能想要搜索一些选择压缩的属性。另一方面,问题 b 看起来 Android PDF 生成器的质量很差,看起来只是一个概念验证。 作为a的补充:嵌入的字体也没有被压缩。因此,如果可以在该 API 中以某种方式激活压缩,则文件会精简很多。 再次感谢您的宝贵时间,我删除了字体定义,文件增加了 1KB,所以您对字体的看法是正确的,关于 a,我找不到任何可用于启用/禁用压缩的标志或设置令人失望:( 【参考方案1】:

好吧,直到有人找到或提供更好的解决方案,我才发现 this 库,不幸的是,它似乎比 Android API(目前)做得更好。

该库可能不支持过于复杂的绘图,但可以满足我的需要。它还压缩了pdf,现在我似乎可以将它与iOS进行比较,并说它比它小。

【讨论】:

关于你找到的APW库,你可能对this answer底部描述的bug感兴趣;它可能尚未修复。 感谢您提供更多信息,我只是希望我不会遇到此类问题,语言是英语,因此我接触此类字符的机会较小,但我也会为此寻找解决方案

以上是关于如何在 Android 上使用 PdfDocument 设置 PDF 文件大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 相机上使用意图添加功能裁剪图像?

如何在 Android 上使用 QOpenGLWidget?

如何在Android上打破通知的内容

如何在 Android 上使用嵌入式 Flash?

如何在 java (Android) 上使用字符串

如何在 Android 上使用硬件加速视频解码?