2012-09-30 6 views
11

Ho preso l'esempio PDF minimo nella specifica PDF da PDF Specification, copiato in Blocco note, rinominato il file per avere l'estensione .pdf.Esempio PDF minimo nelle specifiche PDF

Posso aprirlo con altri visualizzatori di PDF (PDF-XChange, SumatraPDF, MuPDF). Ma quando lo apro con Adobe Reader, dice che il file è rotto.

Non sono sicuro che altri utenti considerino questo file "danneggiato" come file vuoto oppure no.

Il file dovrebbe visualizzare una pagina vuota, poiché è un esempio minimo.

Infatti, modifico l'esempio minimo. Perché quando lo copio dalle specifiche PDF al blocco note e apro il file .txt da un editor esadecimale, vedo una nuova riga nel file .txt darmi 2 spazio. Ad esempio,

1 0 obj 
<< /Type /Catalog 

mi da (in Hex Editor)

1 0 obj << /Type /Catalog 

che è (in valori esadecimali)

31 20 30 20 6F 62 6A 0D 0A 3C 3C 20 2F 54 79 70 
65 20 2F 43 61 74 61 6C 6F 67 

I 2 spazi tra j e < sono 0D 0A.

Quindi non creare nuove righe in NotePad e modificare i valori nella parte xref.

Di seguito è riportato il codice completo.

Sai cosa c'è di sbagliato in questo esempio? Perché Adobe Reader dice che è rotto? È perché ho dato i valori errati in xref?

%PDF-1.4 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> endobj 2 0 obj << /Type Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [4 0 R] /Count 1 >> endobj 4 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 612 792] /Contents 5 0 R /Resources << /ProcSet 6 0 R >> >> endobj 5 0 obj << /Length 35 >> stream … Page-marking operators … endstream endobj 6 0 obj [/PDF] endobj xref 0 7 0000000000 65535 f 0000000009 00000 n 0000000074 00000 n 0000000119 00000 n 0000000176 00000 n 0000000295 00000 n 0000000373 00000 n trailer << /Size 7 /Root 1 0 R >> startxref 395 %%EOF 

risposta

16

Primo: quando si 'copiato' l'esempio della specifica PDF, molto probabilmente un paio di cose è accaduto che ha reso la vostra copia di non funzionare come previsto:

  • ... si didn 't' copia 'ri-digitando l'esempio in un editor di testo, ma
  • ... hai usato copy'n'paste, usando un PDF come file sorgente.

A seconda dell'editor di testo, questo metodo probabilmente ha causato la conversione della convenzione di nuova riga da [cr] + [lf] a [cr] o viceversa. Ciò a sua volta significa che i numeri dell'offset di byte nell''indice 'table of contents' (il 'xref' -table) non sono più validi.

Un altro problema con il codice sorgente in formato PDF che hai postato è che esso non contiene alcun ora a capo affatto. Alcuni spettatori potrebbero essere in grado di analizzare silenziosamente la cosa, ma non tutti lo sono. Ed è certamente contro le specifiche, perché in base alle specifiche, nel capitolo 7.5.2 è chiaramente specificato che

"La prima riga di un file PDF deve essere un'intestazione composta da 5 caratteri% PDF - seguito da un numero di versione del modulo 1.N, dove N è una cifra compresa tra 0 e 7.

L'intestazione viola questa regola.

Inoltre, il 'flusso' in 5 0 obj non è alcun codice PDF valido, si tratta solo di testo segnaposto (… Page-marking operators …). Alcuni spettatori potrebbero essere inclinati quando si imbattono in tale "spazzatura".

Infine, il valore startxref non è corretto.

Quindi ecco un file che funziona. Ho riparato in un editor di testo, e ho messo il codice originale come un commento dopo l'%%EOF di confronto e di riferimento:

%PDF-1.4 
1 0 obj 
<< /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> 
endobj 
2 0 obj 
<< /Type Outlines /Count 0 >> 
endobj 
3 0 obj 
<< /Type /Pages /Kids [4 0 R] /Count 1 >> 
endobj 
4 0 obj 
<< /Type /Page /Parent 3 0 R /MediaBox [0 0 612 792] /Contents 5 0 R /Resources << /ProcSet 6 0 R >> >> 
endobj 
5 0 obj 
<< /Length 35 >> 
stream 
… Page-marking operators … 
endstream 
endobj 
6 0 obj 
[/PDF] 
endobj 
xref 
0 7 
0000000000 65535 f 
0000000009 00000 n 
0000000074 00000 n 
0000000119 00000 n 
0000000176 00000 n 
0000000295 00000 n 
0000000376 00000 n 
trailer 
<< /Size 7 /Root 1 0 R >> 
startxref 
394 
%%EOF 

%% %PDF-1.4 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> endobj 2 0 obj << /Type Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [4 0 R] /Count 1 >> endobj 4 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 612 792] /Contents 5 0 R /Resources << /ProcSet 6 0 R >> >> endobj 5 0 obj << /Length 35 >> stream … Page-marking operators … endstream endobj 6 0 obj [/PDF] endobj xref 0 7 0000000000 65535 f 0000000009 00000 n 0000000074 00000 n 0000000119 00000 n 0000000176 00000 n 0000000295 00000 n 0000000373 00000 n trailer << /Size 7 /Root 1 0 R >> startxref 395 
+0

Grazie Kurt, ma il motivo per cui il valore di startxref è 394 non 396. Non è questo il valore dovrebbe essere l'offset di byte del carattere 'x' in 'xref' in questo file? È 396 in un editor esadecimale. Ma con 396, il file è rotto e 394 funziona. Non conosco la ragione. – user565739

+0

@ user565739: Dovresti eseguire 'dd bs = 1 skip = 394 if = this.pdf'. Ciò significa che hai saltato i primi 394 byte durante il dumping del file. Ora l'output dovrebbe iniziare con 'xref' su una riga da sola. –

+0

Quando ho copiato/incollato questo, ho dovuto modificare il carattere singolo "..." attorno a "Operatori di contrassegno della pagina" per i tre caratteri "..." e lo startxref da 394 a 398. Sospetto che quando copio/incollato il singolo carattere "..." era mungito. Espandendone fino a tre, individuale "." su entrambi i lati dello stream, sono stati aggiunti altri 4 byte che mi hanno spostato a 398 da 394 per l'inizio della tabella xrif. – Pat