Domanda

sto sviluppando un PDF parser / scrittore, ma mi sono bloccato a generare flussi di riferimenti incrociati. Il mio programma legge questo file e quindi rimuove la sua linearizzazione, e decomprime tutti gli oggetti in flussi di oggetti. Infine si costruisce il file PDF e lo salva.

Questo funziona davvero bene quando uso il normale riferimento & rimorchio croce, come si può vedere nella questo file.

Quando si tenta di generare un oggetto stream riferimento incrociato invece (che si traduce in questo file , Adobe Reader non può vederlo.

Qualcuno ha esperienza con PDF e può aiutare me Cerca qual è il problema?

Si noti che il riferimento incrociato è l'unica differenza tra di file 2 e il file 3. I primi 34127 byte sono uguali.

Se qualcuno ha bisogno il contenuto del flusso di riferimento decodificato, scaricare questo file e aprirlo in un editor esadecimale. Ho controllato questa tabella di riferimento più e più volte, ma non sono riuscito a trovare nulla di male. Ma il dizionario sembra essere OK, anche.

Grazie mille per il vostro aiuto !!!

Aggiorna

ho ora completamente risolto il problema. È possibile trovare il nuovo PDF qui .

È stato utile?

Soluzione

Due problemi che vedo (senza guardare i dati del flusso stesso.

  1. " Dimensione intero (obbligatorio) Il numero maggiore di uno rispetto al numero oggetto più elevata utilizzata in questa sezione o in qualsiasi sezione per cui questo è un aggiornamento. Esso è equivalente al ingresso dimensioni in un dizionario trailer ".

    la dimensione dovrebbe essere ... 14.

  2. " N array (opzionale) Un array contenente una coppia di numeri interi per ogni sottosezione in questa sezione Il primo intero è il primo numero oggetto nella sottosezione. Il secondo intero deve il numero di voci nella sottosezione La matrice è ordinata in ordine crescente per numero oggetto. Sottosezioni non si sovrappongono può; un numero di oggetto non possono effettuare più di una voce in una sezione. Valore di default:. [0 Dimensione file] "

    L'indice dovrebbe probabilmente saltare un po 'intorno. Non hai oggetti 2-4 o 7. Le esigenze di matrice di indice per riflettere tale.

  3. I suoi dati non è giusto o (e ho appena imparato fuori per leggere un flusso di riferimento esterno. Yay me.)


00 00 00
01 00 0a
01 00 47
01 01 01
01 01 70
01 02 fd
01 76 f1
01 84 6b
01 84 a1
01 85 4f

Secondo questi dati, che a causa della vostra "no indice" viene interpretato come numero di oggetti da 0 a 9, hanno i seguenti offset:

0 è inutilizzato. Belle.
1 è a 0x0a. Sì, certo è
2 è a 0x47. No. Che le terre vicino l'inizio del "1 0" 's flusso. Questo probabilmente non è una coincidenza.
3 è a 0x101. No. 0x101 è ancora all'interno "1 0" 's flusso.
4 è a 0x170. Idem
5 è a 0x2fd. Idem
6 è a 0x76f1. No, e questa volta sepolto all'interno torrente che di immagine.

Penso che si ottiene l'idea. Quindi, anche se si ha un corretto \ Index, i tuoi compensazioni sono tutte sbagliate (e completamente diverso da quello che c'è in resultNormal.pdf, anche tenendo conto dec-hex confusione).

Ciò che si vuole può essere trovato in riferimento esterno di resultNormal:

xref
0 2
0000000000 65535 f
0000000010 00000 n
5 2
0000003460 00000 n
0000003514 00000 n
8 5
0000003688 00000 n
0000003749 00000 n
0000003935 00000 n
0000004046 00000 n
0000004443 00000 n

Quindi, l'indice dovrebbe essere (se sto leggendo questo diritto): \ indice [0 2 5 2 8 5]. E i dati:
0 0 0
1 0 un
1 3460 (quella decimale)
1 3514 (idem)
1 3688
etc

È interessante notare che le specifiche PDF dice che la dimensione deve essere sia il numero di voci di questo e di tutti gli XRef precedente e il numero uno superiore al numero oggetto più alta in uso.

Non credo che la parte successiva è mai applicata, ma non sarebbe stato sorpreso di scoprire che i flussi xrif sono più ritenzione rispetto alle normali tabelle di riferimenti incrociati. Potrebbe essere la stessa gestione sia del codice, non potrebbe.


@mtraut:

Ecco quello che vedo:

13 0 obj
<</Size 10/Length 44/Filter /FlateDecode/DecodeParms <</Columns 3/Predictor 12>>/W [1 2 0]/Type /XRef/Root 8 0 R>>
streaming
...
endstream
endobj

Altri suggerimenti

Il "resultstream.pdf" non ha un flusso Rif croce valido.

se apro nel mio visore, si cerca di leggere oggetto "13 0" come un flusso ref croce, ma è un dizionario pianura (tag stream e mancano i dati).

Un po 'fuori tema: Che lingua stai sviluppando in? Almeno in Java un sapere di tre scelte di valore (PDFBox, iText e jPod, dove io personalmente come uno degli sviluppatori optano per jPod, molto pulito implementazione :-). Se questo non va bene per la vostra piattaforma, forse si può almeno dare un'occhiata a algoritmi e strutture dati.

modifica

Bene - se "resultstream.pdf" è il documento in questione, allora questo è ciò che il mio editore (SciTE) vede

...
13 0 obj
<</Size 0/W [1 2 0]/Type /XRef/Root 8 0 R>>
endobj
startxref
34127
%%EOF

Non v'è alcun flusso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top