Beliebt

Wie entferne ich doppelte Schriften in einem PDF-Dokument mit 150.000 eingebetteten Schriften? - pdf, Schriftarten

Ich habe eine PDF-Datei analysiert, um festzustellen, warum sie so gro├č ist (400 MB) und welche M├Âglichkeiten ich habe, sie zu verkleinern.

Die PDF-Datei wird durch Zusammenf├╝hren von ca. 15.000 erstelltKleinere PDF-Dateien, die mithilfe einer Vorlage erstellt wurden und theoretisch die gleichen Schriftarten haben sollten. Diese kleinen PDF-Dateien werden von einem Drittanbieter-System erstellt, das f├╝r uns eine Blackbox darstellt.

Ich hatte den Verdacht, dass jede Schriftart mehrmals in die zusammengef├╝hrte PDF-Datei eingef├╝gt wird. Daher dachte ich, ich k├Ânnte in einem ersten Schritt die Dateigr├Â├če reduzieren, indem ich doppelte Schriftarten entferne.

Verwenden pdffonts Ich habe die in einer der einzelnen kleinen PDF-Dateien verwendeten Schriftarten ├╝berpr├╝ft:

$ pdffonts small-00001.pdf
name                                 type              encoding         emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
[none]                               Type 3            Custom           yes no  yes      6  0
[none]                               Type 3            Custom           yes no  yes     25  0
[none]                               Type 3            Custom           yes no  yes     56  0
[none]                               Type 3            Custom           yes no  yes     95  0
[none]                               Type 3            Custom           yes no  yes    125  0
[none]                               Type 3            Custom           yes no  yes    141  0
[none]                               Type 3            Custom           yes no  yes    188  0
[none]                               Type 3            Custom           yes no  yes    212  0
[none]                               Type 3            Custom           yes no  yes    237  0
[none]                               Type 3            Custom           yes no  yes    245  0

Es ist ein bisschen seltsam, dass keine der Schriften einen Namen hat, aber anscheinend ist das in der Spezifikation erlaubt (siehe Tabelle 112 (.pdf)), da die Version der PDF-Dateien 1.4 ist. Wie auch immer, diese kleine PDF-Datei hat 10 Schriftarten.

Ich habe mir die zusammengef├╝hrte PDF-Datei angesehen und:

$ pdffonts merged.pdf | wc -l
150000 # rounded number

Voila! Die zusammengef├╝hrte PDF-Datei hatte mehr als 150.000 Schriftarten!

Die iText Java PDF-Bibliothek hat eine Klasse namens PdfSmartCopy zum Zusammenf├╝hren von PDF-Dateien mit kleinen Details, um doppelte Ressourcen wie Schriftarten in der zusammengef├╝hrten Ausgabe zu vermeiden.

Ich habe ein Programm geschrieben, mit dem die einzelnen Dateien zusammengef├╝hrt werden PdfSmartCopy Die Gr├Â├če der zusammengef├╝hrten PDF-Datei wurde von 400 MB auf weniger als 100 MB reduziert. ich habe erwartet pdffonts um zu zeigen, dass dieses "intelligent" zusammengef├╝hrte PDF nur 10 Schriftarten enth├Ąlt, aber zu meiner ├ťberraschung:

$ pdffonts
20000 # rounded number

So wurde die Anzahl der eingebetteten Schriften von reduziertetwa 150K bis 20K, aber ich habe mich gefragt, ob es eine M├Âglichkeit gibt, die Anzahl der Schriftarten noch weiter zu verringern, oder ob sich diese 20K-Schriftarten in Bezug auf PDF wirklich unterscheiden.

Beim ├ľffnen der kleinen PDF-Datei in einem Texteditor werden folgende Schriftdefinitionen angezeigt:

6 0 obj
<</FontBBox[-40 -200 1000 920]/LastChar 249/FontMatrix[.001 0 0 .001 0 0]/Type/Font/Subtype/Type3/Encoding 7 0 R/CharProcs 8 0 R/ToUnicode 24 0 R/Widths[280 1000 1000 1000 1000 1000 1000 1000 1000 1000 560 280 600 320 600 1000 680 1000 1000 1000 1000 1000 1000 1000 1000 1000 320 560 400 320 280 1000 320 280 1000 1000 1000 1000 1000 1000 1000 1000 1000 280 880 560 600 560 1000 1000 1000 1000 1000 1000 1000 1000 1000 320 280 560 1000 200 600 360 1000 560 560 520 560 560 280 560 560 240 1000 1000 1000 1000 1000 1000 1000 240 520 240 880 560 560 560 560 320 1000 1000 1000 1000 1000 1000 1000 1000 520 280 560 440 720 440 480 480 1000 1000 1000 280 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 280 1000 1000 1000 680 680 720 720 680 600 760 720 240 1000 1000 1000 1000 1000 1000 1000 520 680 560 840 720 760 680 760 720 1000 1000 1000 1000 1000 1000 560 1000 680 560 720 680 1040 680 640 600 1000 1000 1000 1000 1000 1000 560 560 560 560 560 560 560 560 560 560]/FirstChar 64>>
endobj

25 0 obj
<</FontBBox[-57 -228.86 1029 914]/LastChar 249/FontMatrix[.001 0 0 .001 0 0]/Type/Font/Subtype/Type3/Encoding 26 0 R/CharProcs 27 0 R/ToUnicode 55 0 R/Widths[286 1029 1029 1029 1029 1029 1029 1029 1029 1029 543 286 571 343 571 1029 657 1029 1029 1029 1029 1029 1029 1029 1029 1029 314 543 400 343 286 1029 343 286 1029 1029 1029 1029 1029 1029 1029 1029 1029 286 886 543 571 543 1029 1029 1029 1029 1029 1029 1029 1029 1029 343 286 543 1029 200 571 343 1029 514 543 514 543 514 286 543 543 200 1029 1029 1029 1029 1029 1029 1029 257 514 200 829 543 514 543 543 343 1029 1029 1029 1029 1029 1029 1029 1029 514 286 543 486 686 429 486 486 1029 1029 1029 286 1029 1029 1029 1029 1029 1029 1029 1029 1029 1029 1029 1029 1029 1029 1029 286 1029 1029 1029 657 657 714 714 657 600 771 714 257 1029 1029 1029 1029 1029 1029 1029 514 657 543 829 714 771 657 771 714 1029 1029 1029 1029 1029 1029 543 1029 657 600 714 657 1029 657 657 600 1029 1029 1029 1029 1029 1029 543 543 543 543 543 543 543 543 543 543]/FirstChar 64>>
endobj

56 0 obj
<</FontBBox[-30 -214.77 1002.5 939]/LastChar 227/FontMatrix[.001 0 0 .001 0 0]/Type/Font/Subtype/Type3/Encoding 57 0 R/CharProcs 58 0 R/ToUnicode 94 0 R/Widths[273 1030 1030 1030 1030 1030 1030 1030 1030 1030 545 273 576 333 576 1030 636 1030 1030 1030 1030 1030 1030 1030 1030 1030 333 545 394 333 273 1030 333 273 1030 1030 1030 1030 1030 1030 1030 1030 1030 273 879 545 576 545 1030 1030 1030 1030 1030 1030 1030 1030 1030 333 273 545 1030 182 576 364 1030 515 545 515 545 515 303 545 545 212 1030 1030 1030 1030 1030 1030 1030 212 485 212 818 545 515 545 545 333 1030 1030 1030 1030 1030 1030 1030 1030 515 273 545 455 667 455 455 485 1030 1030 1030 273 1030 1030 1030 1030 1030 1030 1030 1030 1030 1030 1030 1030 1030 1030 1030 273 1030 1030 1030 667 667 727 727 667 606 788 727 273 1030 1030 1030 1030 1030 1030 1030 515 667 545 818 727 788 667 788 727 1030 1030 1030 1030 1030 1030 515 1030 667 636]/FirstChar 64>>
endobj

95 0 obj
<</FontBBox[-52 -243.17 1036 914]/LastChar 232/FontMatrix[.001 0 0 .001 0 0]/Type/Font/Subtype/Type3/Encoding 96 0 R/CharProcs 97 0 R/ToUnicode 124 0 R/Widths[276 983 983 983 983 983 983 983 983 983 552 276 586 328 586 983 707 983 983 983 983 983 983 983 983 983 310 552 397 328 345 983 328 276 983 983 983 983 983 983 983 983 983 276 879 552 586 603 983 983 983 983 983 983 983 983 983 328 345 552 983 241 586 483 983 552 603 552 603 552 328 603 603 276 983 983 983 983 983 983 983 276 534 276 897 603 603 603 603 397 983 983 983 983 983 983 983 983 552 328 603 517 776 534 517 500 983 983 983 328 983 983 983 983 983 983 983 983 983 983 983 983 983 983 983 328 983 983 983 707 724 724 724 672 603 776 724 276 983 983 983 983 983 983 983 552 707 603 845 724 776 672 776 724 983 983 983 983 983 983 552 983 672 603 724 672 948 655 638]/FirstChar 64>>
endobj

125 0 obj
<</FontBBox[-48 -236.5 1021.8 929]/LastChar 230/FontMatrix[.001 0 0 .001 0 0]/Type/Font/Subtype/Type3/Encoding 126 0 R/CharProcs 127 0 R/ToUnicode 140 0 R/Widths[286 976 976 976 976 976 976 976 976 976 548 286 595 333 595 976 714 976 976 976 976 976 976 976 976 976 333 548 381 333 333 976 333 286 976 976 976 976 976 976 976 976 976 286 833 548 595 619 976 976 976 976 976 976 976 976 976 333 333 548 976 238 595 476 976 548 619 548 619 548 333 619 619 286 976 976 976 976 976 976 976 286 524 286 881 619 619 619 619 381 976 976 976 976 976 976 976 976 548 333 619 524 786 524 548 500 976 976 976 333 976 976 976 976 976 976 976 976 976 976 976 976 976 976 976 333 976 976 976 690 714 714 714 667 619 786 714 286 976 976 976 976 976 976 976 548 690 619 833 714 786 667 786 714 976 976 976 976 976 976 548 976 667 643 714 667 929]/FirstChar 64>>
endobj

141 0 obj
<</FontBBox[-53 -238.45 1028.2 895]/LastChar 249/FontMatrix[.001 0 0 .001 0 0]/Type/Font/Subtype/Type3/Encoding 142 0 R/CharProcs 143 0 R/ToUnicode 187 0 R/Widths[289 1026 1026 1026 1026 1026 1026 1026 1026 1026 553 289 579 342 579 1026 658 1026 1026 1026 1026 1026 1026 1026 1026 1026 289 553 395 342 289 1026 342 289 1026 1026 1026 1026 1026 1026 1026 1026 1026 289 895 553 579 553 1026 1026 1026 1026 1026 1026 1026 1026 1026 342 289 553 1026 184 579 342 1026 553 553 500 553 526 289 553 553 237 1026 1026 1026 1026 1026 1026 1026 237 500 237 868 553 553 553 553 342 1026 1026 1026 1026 1026 1026 1026 1026 500 289 553 500 684 447 500 474 1026 1026 1026 289 1026 1026 1026 1026 1026 1026 1026 1026 1026 1026 1026 1026 1026 1026 1026 289 1026 1026 1026 658 658 711 711 658 605 789 711 289 1026 1026 1026 1026 1026 1026 1026 500 658 553 816 711 789 658 789 711 1026 1026 1026 1026 1026 1026 553 1026 658 605 711 658 1000 658 658 605 1026 1026 1026 1026 1026 1026 553 553 553 553 553 553 553 553 553 553]/FirstChar 64>>
endobj

188 0 obj
<</FontBBox[-40 -240 1040 940]/LastChar 227/FontMatrix[.001 0 0 .001 0 0]/Type/Font/Subtype/Type3/Encoding 189 0 R/CharProcs 190 0 R/ToUnicode 211 0 R/Widths[280 980 980 980 980 980 980 980 980 980 560 280 580 340 580 980 720 980 980 980 980 980 980 980 980 980 300 560 380 340 340 980 340 280 980 980 980 980 980 980 980 980 980 280 840 560 580 620 980 980 980 980 980 980 980 980 980 340 340 560 980 240 580 480 980 560 620 560 620 560 340 620 600 280 980 980 980 980 980 980 980 280 540 280 880 600 620 620 620 380 980 980 980 980 980 980 980 980 560 340 600 520 780 540 540 500 980 980 980 340 980 980 980 980 980 980 980 980 980 980 980 980 980 980 980 340 980 980 980 700 720 720 720 660 620 780 720 260 980 980 980 980 980 980 980 560 700 620 820 720 780 660 780 720 980 980 980 980 980 980 560 980 660 640]/FirstChar 64>>
endobj

212 0 obj
<</FontBBox[-48 -212.73 998.26 905]/LastChar 249/FontMatrix[.001 0 0 .001 0 0]/Type/Font/Subtype/Type3/Encoding 213 0 R/CharProcs 214 0 R/ToUnicode 236 0 R/Widths[286 1024 1024 1024 1024 1024 1024 1024 1024 1024 548 286 595 333 595 1024 667 1024 1024 1024 1024 1024 1024 1024 1024 1024 333 548 381 333 286 1024 333 286 1024 1024 1024 1024 1024 1024 1024 1024 1024 286 881 548 595 548 1024 1024 1024 1024 1024 1024 1024 1024 1024 333 286 548 1024 190 595 357 1024 548 548 500 548 548 310 548 548 238 1024 1024 1024 1024 1024 1024 1024 238 500 238 857 548 548 548 548 333 1024 1024 1024 1024 1024 1024 1024 1024 476 286 548 548 667 524 500 500 1024 1024 1024 286 1024 1024 1024 1024 1024 1024 1024 1024 1024 1024 1024 1024 1024 1024 1024 286 1024 1024 1024 667 667 714 714 667 619 786 714 286 1024 1024 1024 1024 1024 1024 1024 500 667 548 833 714 786 667 786 714 1024 1024 1024 1024 1024 1024 548 1024 667 619 714 667 1000 643 667 619 1024 1024 1024 1024 1024 1024 548 548 548 548 548 548 548 548 548 548]/FirstChar 64>>
endobj

237 0 obj
<</FontBBox[-27 -253.67 733 800]/LastChar 243/FontMatrix[.001 0 0 .001 0 0]/Type/Font/Subtype/Type3/Encoding 238 0 R/CharProcs 239 0 R/ToUnicode 244 0 R/Widths[173 173 173 173]/FirstChar 240>>
endobj

245 0 obj
<</FontBBox[-53 -238.45 1028.6 947]/LastChar 249/FontMatrix[.001 0 0 .001 0 0]/Type/Font/Subtype/Type3/Encoding 246 0 R/CharProcs 247 0 R/ToUnicode 293 0 R/Widths[289 974 974 974 974 974 974 974 974 974 553 289 579 342 579 974 711 974 974 974 974 974 974 974 974 974 289 553 395 342 342 974 342 289 974 974 974 974 974 974 974 974 974 289 868 553 579 605 974 974 974 974 974 974 974 974 974 342 342 553 974 237 579 474 974 553 605 553 605 553 342 605 605 289 974 974 974 974 974 974 974 289 526 289 921 605 605 605 605 395 974 974 974 974 974 974 974 974 553 342 605 526 763 526 526 474 974 974 974 342 974 974 974 974 974 974 974 974 974 974 974 974 974 974 974 342 974 974 974 711 711 711 711 658 605 789 711 289 974 974 974 974 974 974 974 553 684 605 868 711 789 658 789 711 974 974 974 974 974 974 553 974 658 605 711 658 921 632 632 605 974 974 974 974 974 974 553 553 553 553 553 553 553 553 553 553]/FirstChar 64>>
endobj

1 0 obj
<</Contents 2 0 R/Type/Page/Resources<</XObject<</Im3 3 0 R/Im1 4 0 R/Im2 5 0 R>>/Font<</F1 6 0 R/F2 25 0 R/F10 56 0 R/F3 95 0 R/F4 125 0 R/F5 141 0 R/F6 188 0 R/F9 212 0 R/F8 237 0 R/F7 245 0 R>>>>/MediaBox[0 0 595.2 841.92]/Parent 294 0 R>>
endobj

Sind das wirklich 10-11 verschiedene Schriften? Oder sind diese 10 Komponenten der gleichen Schriftart?

Auch nach der Spezifikation:

CharProcs: (Erforderlich) Ein W├Ârterbuch, in dem jeder Schl├╝ssel eine Glyphe sein soll Name und der diesem Schl├╝ssel zugeordnete Wert m├╝ssen ein Inhaltsstrom sein das konstruiert und malt die Glyphe f├╝r diesen Charakter. Der Strom umfasst als ersten Operator entweder d0 oder d1, gefolgt von Operatoren, die ein oder mehrere Grafikobjekte beschreiben, einschlie├člich Pfad-, Text- oder Bildobjekte. Weitere Informationen zu Typ 3 finden Sie weiter unten Glyphenbeschreibungen.

Aber die CharProcs in dieser PDF-Datei scheinen zu klein zu sein "Sei ein Content-Stream, der die Glyphe f├╝r diesen Charakter erstellt und malt.". Beispielsweise:

237 0 obj
<<
/FontBBox[-27 -253.67 733 800]
/LastChar 243
/FontMatrix[.001 0 0 .001 0 0]
/Type/Font
/Subtype/Type3
/Encoding 238 0 R
/CharProcs 239 0 R
/ToUnicode 244 0 R
/Widths[173 173 173 173]
/FirstChar 240>>
endobj
  1. Sind diese /FontBBox Schnipsel repr├Ąsentieren jeweils eine Schriftart? Warum ihre /CharProcs es ist zu klein?

  2. Wie kann ich sicherstellen, dass diese 20.000 KB gro├čen Schriftarten in der endg├╝ltigen PDF-Datei wirklich unterschiedlich sind - und wenn nicht, wie kann ich die Duplikate weiter entfernen?

Antworten:

5 f├╝r Antwort Ôäľ 1

Type3-Schriften sind in PDF-Dateien unglaublich selten. Type3-Schriften sind eigentlich PDF-Schriften, da die Glyphen in PDF-Seiten-Grafikoperatoren beschrieben werden. Sie w├╝rden also nie auf eine Typ 3-Schriftart au├čerhalb eines PDF-Dokuments sto├čen, da nur ein PDF-Renderer wei├č, was zu tun ist.

  1. Die Glyphen werden in dem Objekt definiert, auf das verwiesen wirddurch den CharProcs-Schl├╝ssel. Also Objekt 239 in deinem letzten Beispiel. Die / FontBBox wird normalerweise nur f├╝r die Textauswahl verwendet. Sie k├Ânnten wahrscheinlich alle FontBBoxen zusammenfassen.

  2. Sie k├Ânnten die Grafikoperatoren ├╝berpr├╝fen oder sogarHasch einfach die Streams, um ├ťbereinstimmungen zu finden. Dann k├Ânnten Sie vielleicht neue Schriften mit den gesammelten Schriften synthetisieren. Sie m├╝ssen jedoch auch die Codierungen ├╝berpr├╝fen. Wenn jede Schriftart unterschiedlich codiert ist und unterschiedliche Zeichencodes unterschiedlichen Glyphen zugeordnet sind, m├╝ssen Sie zur├╝ckgehen und auch die Seiteninhaltsstr├Âme mit den neuen Zeichencodes neu schreiben. Schlie├člich m├Âchten Sie wahrscheinlich die ToUnicode-Zuordnungen korrekt halten (wenn Sie die Textauswahl / -extraktion beibehalten m├Âchten), dh auch den Zeichencode in Unicode-Zuordnungen verfolgen und neue ToUnicode-CMaps generieren.

Kurz gesagt, das Reparieren als Nachbearbeitungsschritt ist nicht trivial.

Es ist in der Regel viel besser / einfacher, sich beim Erstellen der PDF-Dateien mit dem Stamm des Problems zu befassen und diese zusammenzuf├╝hren, sodass Sie das Problem nicht haben.