【发布时间】: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,我找不到任何可用于启用/禁用压缩的标志或设置令人失望:(