Java 使用iText删除PDF中重复的字体

Java 使用iText删除PDF中重复的字体,java,itextsharp,itext,Java,Itextsharp,Itext,我正在使用iText2.1.5合并2个PDF文件。我的问题是,生成连接的pdf时,两个pdf中使用的所有字体都是重复的。有没有更好的方法来处理这个问题,使字体只嵌入一次 源代码: public class GroupingPDF { public static final String RESULT = "/home/asagaama/Documents/groupementpdf/get/concatenated.pdf";; public static void

我正在使用iText2.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();
        }
    }
}
公共类分组PDF{
公共静态最终字符串RESULT=“/home/asagama/Documents/groupementpdf/get/concatenated.pdf”;;
公共静态void main(字符串[]args){
试一试{
字符串[]文件={
“/home/asagama/Documents/groupementpdf/get/1.pdf”,
“/home/asagama/Documents/groupementpdf/get/2.pdf”};
文档=新文档();
PdfSmartCopy PdfSmartCopy=新的PdfSmartCopy(文档,
新的FileOutputStream(结果));
document.open();
PDF阅读器;
int n;
//循环遍历要连接的文档
对于(int i=0;i
我检查了您的文件,并对每页使用的字体资源进行了屏幕截图:

第1页:

我们看到5种字体:

  • EUDXLQ+FranklinGothic书籍
  • XQNBQD+FranklinGothicLT图书
  • DDOZBL+Helvetica.ttf
  • DYKMGD+FranklinGothicLT-Demi
  • MZDMJV+ArialMT
  • 第2页:

    我们看到4种字体:

  • KWKZVU+FranklinGothic书(FranklinGothic书的一个子集,与第1页不同)
  • WUQFPY+FranklinGothicLT书(FranklinGothicLT的子集,与第1页的不同)
  • SQWYVD+FranklinGothicLT-Demi(FranklinGothicLT-Demi的子集,与第1页的子集不同)
  • ZKEBIA+ArialMT(ArialMT的子集,与第1页的子集不同)
  • 第3页:

    此页面有2种字体:

  • KWKZVU+FranklinGothic图书(与第2页相同的子集,也是相同的对象:对象34 0)
  • ZKEBIA+ArialMT(与第2页相同的子集,也是相同的对象:对象44 0)
  • 第4页:

    此页面有2种字体:

  • KWKZVU+FranklinGothic图书(与第2页相同的子集,也是相同的对象:对象34 0)
  • ZKEBIA+ArialMT(与第2页相同的子集,也是相同的对象:对象44 0)
  • 如果这是使用
    PdfSmartCopy
    的结果,那么iText已经很好地完成了它的工作。相同的字体子集存储在同一对象中(无冗余字体)

    不幸的是,ArialMT和一些FranklinGothic字体无法重用,因为字体子集不同。iText无法合并同一字体的不同字体集

    我已经在评论中解释了这一点,但是你提出了一些不真实的指控。只有在你分享了文件之后,我才能证明你的问题是基于错误的假设

    更新:

    如果要连接PDF并减少字体数量,您有哪些选择

    如果不嵌入字体,iText将检测相同的字体字典,iText将删除多余的字体字典。如果嵌入完整字体(因此,如果不允许PDF制作者创建子集),情况也是如此。但是,嵌入完整字体并不总是一个选项。根据字体的不同,这可能会导致文件大小更大


    我们的技术路线图上有字体改进,但我不认为将字体子集合并为单个字体不是该子项目的一部分。在某些情况下,在iText中实现这一点可能是可行的,例如,在使用可预测编码的情况下。在其他情况下,合并不同的子集几乎是不可能的,因为这需要重写整个内容流。

    您是否在谈论嵌入式字体?如果嵌入,您是在谈论字体子集还是完整字体?如果是子集,没有人能帮助你。如果是非嵌入式字体或完全嵌入式字体,您使用错误的方式连接PDF(对于这一点,您应该升级错误的iText版本)。我说的是嵌入式子集字体,为什么没有人可以帮助我?因为您不仅仅要求删除重复的字体(如果您谈论的是未嵌入的字体或完全嵌入的字体,这是一个不需要动脑筋的问题),您要求将同一字体的不同子集合并到一个字体对象中。这相当复杂,可能需要重写整个内容流。使用iText,您只能通过重用相同的字体子集来减小文件大小。当它们不同时,除非将它们合并,否则无法重用不同的子集(不支持合并子集)。Bruno,这不是我的目标,我只想删除重复的嵌入子集字体,所以总结一下,我有一个例子,pdf 1带有字体(Arial MT TrueType(CID)嵌入子集)和pdf 2带有字体(Arial MT TrueType(CID)嵌入子集和Helvetica.ttf TrueType(CID)嵌入子集),在合并pdf之后,我得到了一个pdf,具有重复字体(Arial MT TrueType(CID)嵌入子集),因此我想有一个Arial MT TrueType(CID)嵌入子集。我在互联网上搜索,解决方案是使用PDFSmartCopy,但它对我不起作用。答案确实是
    PDFSmartCopy