我正在使用iText 2.1.5合并2个PDF文件。我的问题是,当生成连接的pdf时,两个pdf中使用的所有字体都是重复的。有没有更好的方法来处理这个,所以字体只嵌入一次?
源代码:
public class GroupingPDF {
public static final String RESULT = "/home/asagaama/Documents/groupementpdf/get/concatenated.pdf";;
public static void main(String[] args) {
try {
String[] files = {
"/home/asagaama/Documents/groupementpdf/get/1.pdf",
"/home/asagaama/Documents/groupementpdf/get/2.pdf" };
Document document = new Document();
PdfSmartCopy pdfSmartCopy = new PdfSmartCopy(document,
new FileOutputStream(RESULT));
document.open();
PdfReader reader;
int n;
// loop over the documents you want to concatenate
for (int i = 0; i < files.length; i++) {
reader = new PdfReader(files[i]);
// loop over the pages in that document
n = reader.getNumberOfPages();
for (int page = 0; page < n;) {
pdfSmartCopy.addPage(pdfSmartCopy.getImportedPage(reader,
++page));
}
}
document.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:2)
我检查了你的文件,并且我已经截取了每个页面使用的字体资源的屏幕截图:
第1页:
我们看到5种字体:
第2页:
我们看到4种字体:
第3页:
此页面有2种字体:
第4页:
此页面有2种字体:
如果这是使用PdfSmartCopy
的结果,那么iText已经完成了它的工作。相同的字体子集存储在同一个对象中(没有冗余字体)。
不幸的是,ArialMT和一些FranklinGothic字体无法重复使用,因为字体的子集不同。 iText无法合并相同字体的不同字体集。
我已在评论中解释过这一点,但后来你提出了一些不正确的指控。只有在您分享文档后,我才能证明您的问题是基于错误的假设。
<强>更新强>
如果要连接PDF并减少字体数量,有什么选择?
如果您没有嵌入字体,那么iText将检测相同的字体词典,iText将删除冗余字体词典。如果嵌入完整字体也是如此(因此,如果您不允许PDF生成器创建子集)。但是,嵌入完整字体并不总是一种选择。根据字体的不同,这可能会导致文件大小更大。
我们在技术路线图上有字体改进,但我不认为将字体子集合并为单个字体不属于该子项目。在某些情况下,在iText中实现这一点可能是可行的,例如:在使用可预测编码的情况下。在其他情况下,合并不同的子集几乎是不可能的,因为它需要重写整个内容流。