Sammenslåing av PDF dokumenter

Dette programmet er skrevet for å gjøre det mulig å slå sammen flere PDF dokumenter. Oppbygningen av et PDF dokument gjør at det ikke bare er å føye til et nytt dokument der det andre slutter. Her følger en liten beskrivelse av PDF formatets oppbygning, og hvordan det må leses. Man begynner nederst, og følger de numrerte punktene.

%PDF-1.4
%äãÏÒ
 
3 0 obj
<</Length 4 0 R
/Filter/FlateDecode
>>
stream
xœ
endstream
endobj
 
4 0 obj
8
endobj
 
2 0 obj
<</Type/Page
/Parent 1 0 R
/Resources 5 0 R
/MediaBox[0 0 595 842]
/Contents[3 0 R ]
>>
endobj
6. Nå er vi kommet til en sidebeskrivelse. Vi får vite hvilken sidegruppe siden tilhører, informasjon om arkstørrelse, og hvor vi finner fonter, grafikk, bilder og tekst som hører til siden.
5 0 obj
<</ProcSet[/PDF/ImageB/ImageC/ImageI/Text]
>>
endobj
 
6 0 obj
<</CreationDate (D:20040612014140-22'00')
/Producer (PDFlib \(PHP/Win32\))
>>
endobj
 
1 0 obj
<</Type/Pages
/Count 1
/Kids[2 0 R]
>>
endobj
5. Her er første (og i dette tilfellet eneste) sidegruppe. Den forteller oss hvor mange sider den har, og hvor vi finner dem. I dette tilfellet ligger side 1 i objekt nummer 2.
7 0 obj
<</Type/Catalog
/Pages 1 0 R
>>
endobj
4. Dette er /root objektet. Her finner vi informasjon om hvor vi finner den første side gruppen. Sidene i et pdf dokument er delt inn i grupper, og sidegruppene kan inneholde andre sidegrupper. Her finner vi bare en gruppe, og den finner vi i objekt nummer 1.
xref
0 8
0000000000 65535 f
0000000398 00000 n
0000000112 00000 n
0000000015 00000 n
0000000095 00000 n
0000000215 00000 n
0000000276 00000 n
0000000452 00000 n
2. Dette er en tabell som forteller byteposisjon til alle objekter i dokumentet. Denne leses inn og lagres for å finne igjen objektene senere. Listen er organisert slik at på linje nummer 7 finner vi byteposisjon til objekt nummer 7. (Hvis vi ser bort i fra den øverste linjen "0000000000 65535 f")
trailer
<</Size 8
/Root 7 0 R
/Info 6 0 R
/ID[<C40685374502586AB....>]
>>
3. Dette leses rett etter tabellen. Her finnes objektnummeret til /root, det øverste objektet hvis man tenker seg pdf dokumentet som en Unix basert katalogstruktur. For å finne lokasjonen til /root, leser vi i tabellen (punkt 2) på linje 7 (7 0 R betyr referanse til 7). Vi finner også et nummer til et /info objekt som inneholder diverse informasjon om dokumentet.
startxref
499
%%EOF
1. Først leses nummeret her som forteller byteposisjon på index tabellen.

Når programmet har gjennomført stegene fra 1 til 6 så lagres alle de andre objektene inn i en array. Programmet sletter så root, info, alle sidegrupper, sidebeskrivelser og tabeller fra dokumentet. Disse skal bygges opp på nytt når vi er ferdig med å legge til nye dokumenter. Når vi så legger til nye dokumenter, føyer vi bare på objektene fra de nye dokumentene (alle utenom root, info, sidebeskrivelser osv.).

Problemet nå er at alle referanser peker til feil plass. Vi må derfor lage et "kart" som forteller oss hva de nye referansene blir, for så å gå gjennom dokumentet og skifte ut alle referansene. Denne prosessen kan ta litt lang tid på større dokumenter.

Når vi har føyd til alle dokumentene vi vil ha, lager programmet et ferdig samlet dokumentet til oss.

Voilá! Så har vi et dokument av dokumenter.