输入:包含嵌入字体的(例如14个)PDF / A-1b文件列表.

处理:与Apache PDFBOX进行简单合并.

结果:1个文件大小(太大)的PDF / A-1b文件. (它几乎是所有源文件大小的总和).

问题:有没有办法减少生成的PDF的文件大小?

想法:删除冗余的嵌入字体.但是怎么样?这是正确的方法吗?

不幸的是,以下代码没有完成这项工作,但突出了明显的问题.

try (PDDocument document = PDDocument.load(new File("E:/tmp/16189_ZU_20181121195111_5544_2008-12-31_Standardauswertung.pdf"))) {

List collectedFonts = new ArrayList<>();

PDPageTree pages = document.getDocumentCatalog().getPages();

int pageNr = 0;

for (PDPage page : pages) {

pageNr++;

Iterable names = page.getResources().getFontNames();

System.out.println("Page " + pageNr);

for (COSName name : names) {

collectedFonts.add(name);

System.out.print("\t" + name + " - ");

PDFont font = page.getResources().getFont(name);

System.out.println(font + ", embedded: " + font.isEmbedded());

page.getCOSObject().removeItem(COSName.F);

page.getResources().getCOSObject().removeItem(name);

}

}

document.save("E:/tmp/output.pdf");

}

代码产生如下输出:

Page 1

COSName{F23} - PDTrueTypeFont ArialMT-Bold, embedded: true

COSName{F27} - PDTrueTypeFont ArialMT-Regular, embedded: true

Page 2

COSName{F23} - PDTrueTypeFont ArialMT-Bold, embedded: true

COSName{F33} - PDTrueTypeFont ArialMT-BoldItalic, embedded: true

COSName{F25} - PDTrueTypeFont ArialMT-Italic, embedded: true

COSName{F27} - PDTrueTypeFont ArialMT-Regular, embedded: true

Page 3

COSName{F23} - PDTrueTypeFont ArialMT-Bold, embedded: true

COSName{F25} - PDTrueTypeFont ArialMT-Italic, embedded: true

COSName{F27} - PDTrueTypeFont ArialMT-Regular, embedded: true

Page 4

COSName{F23} - PDTrueTypeFont ArialMT-Bold, embedded: true

COSName{F25} - PDTrueTypeFont ArialMT-Italic, embedded: true

COSName{F27} - PDTrueTypeFont ArialMT-Regular, embedded: true

Page 5

COSName{F23} - PDTrueTypeFont ArialMT-Bold, embedded: true

COSName{F33} - PDTrueTypeFont ArialMT-BoldItalic, embedded: true

COSName{F27} - PDTrueTypeFont ArialMT-Regular, embedded: true

Page 6

COSName{F23} - PDTrueTypeFont ArialMT-Bold, embedded: true

COSName{F33} - PDTrueTypeFont ArialMT-BoldItalic, embedded: true

COSName{F27} - PDTrueTypeFont ArialMT-Regular, embedded: true

Page 7

COSName{F23} - PDTrueTypeFont ArialMT-Bold, embedded: true

COSName{F33} - PDTrueTypeFont ArialMT-BoldItalic, embedded: true

COSName{F27} - PDTrueTypeFont ArialMT-Regular, embedded: true

Page 8

COSName{F23} - PDTrueTypeFont ArialMT-Bold, embedded: true

COSName{F25} - PDTrueTypeFont ArialMT-Italic, embedded: true

COSName{F27} - PDTrueTypeFont ArialMT-Regular, embedded: true

Page 9

COSName{F23} - PDTrueTypeFont ArialMT-Bold, embedded: true

COSName{F33} - PDTrueTypeFont ArialMT-BoldItalic, embedded: true

COSName{F25} - PDTrueTypeFont ArialMT-Italic, embedded: true

COSName{F27} - PDTrueTypeFont ArialMT-Regular, embedded: true

Page 10

COSName{F23} - PDTrueTypeFont ArialMT-Bold, embedded: true

COSName{F33} - PDTrueTypeFont ArialMT-BoldItalic, embedded: true

COSName{F25} - PDTrueTypeFont ArialMT-Italic, embedded: true

COSName{F27} - PDTrueTypeFont ArialMT-Regular, embedded: true

Page 11

COSName{F23} - PDTrueTypeFont ArialMT-Bold, embedded: true

COSName{F33} - PDTrueTypeFont ArialMT-BoldItalic, embedded: true

COSName{F27} - PDTrueTypeFont ArialMT-Regular, embedded: true

Page 12

COSName{F23} - PDTrueTypeFont ArialMT-Bold, embedded: true

COSName{F25} - PDTrueTypeFont ArialMT-Italic, embedded: true

COSName{F27} - PDTrueTypeFont ArialMT-Regular, embedded: true

Page 13

COSName{F23} - PDTrueTypeFont ArialMT-Bold, embedded: true

COSName{F25} - PDTrueTypeFont ArialMT-Italic, embedded: true

COSName{F27} - PDTrueTypeFont ArialMT-Regular, embedded: true

Page 14

COSName{F23} - PDTrueTypeFont ArialMT-Bold, embedded: true

COSName{F25} - PDTrueTypeFont ArialMT-Italic, embedded: true

COSName{F27} - PDTrueTypeFont ArialMT-Regular, embedded: true

任何帮助赞赏…

解决方法:

在文件中调试时,我发现相同字体的字体文件被多次引用.因此,使用已查看的字体文件项替换字典中的实际字体文件项,删除了引用并可以进行压缩.通过这种方式,我能够将30 MB的文件缩小到大约6 MB.

File file = new File("test.pdf");

PDDocument doc = PDDocument.load(file);

Map fontFileCache = new HashMap<>();

for (int pageNumber = 0; pageNumber < doc.getNumberOfPages(); pageNumber++) {

final PDPage page = doc.getPage(pageNumber);

COSDictionary pageDictionary = (COSDictionary) page.getResources().getCOSObject().getDictionaryObject(COSName.FONT);

for (COSName currentFont : pageDictionary.keySet()) {

COSDictionary fontDictionary = (COSDictionary) pageDictionary.getDictionaryObject(currentFont);

for (COSName actualFont : fontDictionary.keySet()) {

COSBase actualFontDictionaryObject = fontDictionary.getDictionaryObject(actualFont);

if (actualFontDictionaryObject instanceof COSDictionary) {

COSDictionary fontFile = (COSDictionary) actualFontDictionaryObject;

if (fontFile.getItem(COSName.FONT_NAME) instanceof COSName) {

COSName fontName = (COSName) fontFile.getItem(COSName.FONT_NAME);

fontFileCache.computeIfAbsent(fontName.getName(), key -> fontFile.getItem(COSName.FONT_FILE2));

fontFile.setItem(COSName.FONT_FILE2, fontFileCache.get(fontName.getName()));

}

}

}

}

}

final ByteArrayOutputStream baos = new ByteArrayOutputStream();

doc.save(baos);

final File compressed = new File("test_compressed.pdf");

baos.writeTo(new FileOutputStream(compressed));

也许这不是最优雅的方式,但它可以工作并保持PDF / A-1b的兼容性.

标签:java,pdf,fonts,pdfbox,filesize

来源: https://codeday.me/bug/20191006/1858483.html

java压缩pdf大小_如何使用pdfbox或其他java库减小合并的PDF / A-1b文件的大小相关推荐

  1. Java如何控制生成pdf的大小_如何使用pdfbox或其他Java库减小合并的PDF / A-1b文件的大小...

    输入 :包含嵌入式字体的(例如14个)PDF / A-1b文件列表. 处理 :与Apache PDFBOX进行简单合并. 结果 :1个PDF / A-1b文件,文件大小太大(太大).(这几乎是所有源文 ...

  2. java生成pdf图表_开发员指南:使用Java图表转换为PDF/JPG等图像

    Aspose.Cells for JavaExcel电子表格处理API,它允许Java开发人员在自己的Java应用程序中嵌入可读取.写入和操作Excel电子表格的能力,而无需依赖Microsoft E ...

  3. java 插桩 工具_一个基于Eclipse的通用Java程序插桩工具.pdf

    第38卷第7期 计算机科学 V01.38NO.7 Science 2011 2011年7月 Computer July 一个基于Eclipse的通用Java程序插桩工具 郑晓梅 (南京中医药大学信息技 ...

  4. 中秋节图案 用java代码打出来_这个中秋,我用 Java 画了一个月饼!

    栈长代表微信公众号 "Java技术栈" 祝所有粉丝中秋佳节快乐! 为了用一种特殊的方式表达我的心意,去年中秋节,我写了这篇文章: 没错,去年一天,我学了 20 种编程语言,刺激.. ...

  5. java 微信 接收消息_微信公众平台开发教程Java版(三) 消息接收和发送

    https://www.iteye.com/blog/tuposky-2017429 前面两章已经介绍了如何接入微信公众平台,这一章说说消息的接收和发送 可以先了解公众平台的消息api接口(接收消息, ...

  6. java泛型 简书_一文带你认识Java泛型基础

    Java泛型基础 1. 认识泛型 泛型是在JDK1.5之后增加的新功能. 泛型可以解决数据的安全性问题, 主要的原理是在类声明的时候通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型. ...

  7. java语言程序设计你_清华大学出版社-图书详情-《Java语言程序设计》

    前言 Java语言是一种典型的面向对象的.跨平台的.支持分布式和多线程的优秀编程语言,具有极强的扩展性.自其诞生以来,迅速被业界认可并广泛应用于Web应用程序的开发中.在此形势下,国内高校在计算机及相 ...

  8. java编程最新图书_清华大学出版社-图书详情-《Java程序设计》

    前言 Java是一种完全面向对象的程序设计语言,具有卓越的通用性.高效性.平台移植性和安全性,得到广泛的应用.在全球云计算和移动互联网产业高速发展的环境下,Java具备显著的优势和广阔前景.本书以Ja ...

  9. java自动推断类型_推断:Facebook的新Java静态分析工具

    java自动推断类型 如何使用Facebook的Infer改善Java开发工作流程? 如果您与技术话题保持同步(如果您正在阅读此博客,我想您会这样做),那么您可能听说过Facebook 刚刚向公众发布 ...

最新文章

  1. AlertDialog和自定义对话框
  2. HDU4267(2012年长春站)
  3. Linux 系统应用编程——网络编程(高级篇)
  4. Android之jni深入
  5. ECCV2018——点云处理相关文章
  6. 问题:gateway Invalid host lb://dabing_goods
  7. ArcGIS 10.2.2 for Desktop非管理员权限用户连接Oracle12c,崩溃
  8. Flex桌面AIR软件日志添加
  9. Keil5 显示汉字时字体不生效,设置国标时,字体设置无效。
  10. 百度之星程序设计大赛输出格式的注意
  11. Apizza 在线Api接口测试工具
  12. 调用百度云短语音合成简单程序
  13. 嵌入式系统开发笔记10:CJ/T-188 水表协议解析2
  14. IPAD/IOS 访问限制密码找回方法(设置-通用-访问限制-密码的非刷机找回方法)
  15. 程序员的这些前五大无奈,你占了多少?
  16. Excel如何从另一个表中自动提取另一个表对应的数据?
  17. 08音视频设备类、09信息技术设备、16电信终端设备CCC认证流程费用及周期
  18. python科学计算—— numpy
  19. 阿米云销CRM V2.0.0 正式公测
  20. Centos7安装部署免费confluence wiki

热门文章

  1. 2021顺丰科技实习 面经
  2. 台式电脑如何修复计算机,大神告诉你电脑不断重启如何修复
  3. Java 实现发票信息输出为 PDF 文件(模板化)
  4. 华为认证证书有什么好处
  5. RGB颜色空间、色调、饱和度、亮度、HSV颜色空间详解
  6. 什么是H5页面及又该如何制作?
  7. 柠檬班Python高级软件测试开发2022年
  8. linux驱动原载-- touch pannel驱动
  9. 会说话的代码 Python pyttsx3,及AttributeError:partially initialized module......(......)报错,解决方法
  10. php中seo优化怎么做,SEO技术:对于PHP页面的SEO优化