2010-05-25 31 views
5

Ho bisogno di pre-produrre un milione o due file PDF da un semplice modello (poche pagine e tabelle) con caratteri incorporati. Di solito, rimango a un livello basso in un caso come questo, e compongo tutto con una libreria come ReportLab, ma mi sono unito a tarda ora nel progetto.Un modo affidabile e veloce per convertire un file ODT zillion in PDF?

Attualmente, ho un template.odt e uso i marcatori nei file content.xml per riempire con i dati di un DB. Posso creare facilmente i file ODT, guardano sempre con rigore.

Per l'ODT alla conversione PDF, sto utilizzando OpenOffice in modalità server (e PyODConverter w/named pipe), ma non è molto affidabile: in un lotto di documenti, c'è finalmente un punto dopo il quale tutti i trattati i file vengono convertiti in rifiuti (caratteri e lettere errati sparsi su tutta la pagina).

Il problema non è prevedibilmente riproducibile (non dipende dai dati), succede in OOo 2.3 e 3.2, in Ubuntu, XP, Server 2003 e Windows 7. Il rilevatore Heisenbug sta ticchettando.

Ho provato a ridurre la dimensione dei lotti e riavviare OOo dopo ciascuno; ancora, una piccola percentuale dei documenti sono incasinati.

Naturalmente scriverò su questo nelle mailing list Ooo, ma nel frattempo, ho una consegna e ho già perso troppo tempo.

Dove posso andare?

  1. evitare completamente il formato ODT e andare per un altro sistema di template.

    • suggerimenti? Tutto ciò che richiede pochi secondi per essere eseguito è troppo lento. OOo impiega circa un secondo e somme a 15 giorni di tempo di elaborazione. Ho dovuto scrivere un programma per raggruppare i lavori su diversi client.
  2. Conservare il formato ma passare a un altro strumento/programma per la conversione.

    • Quale? Ci sono molte applicazioni nel repository shareware o commerciali per Windows, ma provarle ognuna è un compito scoraggiante. Alcuni sono troppo lenti, alcuni non possono essere eseguiti in batch senza acquistarli prima, alcuni non possono funzionare da riga di comando, ecc.
    • Gli strumenti open source tendono a non reinventare la ruota e spesso dipendono da openoffice.
  3. Conversione in un formato .DOC intermedio potrebbe aiutare ad evitare il bug di OOo, ma sarebbe il doppio del tempo di elaborazione e complicare un compito che è già troppo peloso.

  4. Provare a produrre i PDF due volte e confrontarli, scartando l'intero lotto se c'è qualcosa di sbagliato.

    • Sebbene i documenti siano uguali, non conosco alcun modo per confrontare il contenuto binario.
  5. Riavviare OOo dopo l'elaborazione di ciascun documento.

    • ci sarebbe voluto molto più tempo per produrli
    • sarebbe abbassare la percentuale dei file sbagliato, e rendono molto difficile la loro identificazione.
  6. Andare per ReportLab e ricreare le pagine al livello di programmazione. Questo è l'approccio che proverò tra qualche minuto.

  7. Impara a formattare correttamente gli elenchi puntati

grazie mille.

Modifica: sembra che non sia possibile utilizzare ReportLab, non mi consente di incorporare il carattere. Il mio font è disponibile nelle versioni TrueType e OpenType.

Il TrueType dice "TTFError: Font non consente subsetting/embedding (0100)".

La versione di OpenType indica che "i profili di [...] postscript di TTFError non sono supportati".

Molto molto divertente.

+0

C'è un modo per rilevare in modo affidabile il danneggiamento nei file PDF risultanti? Qualche tipo di firma che contengono tutti? Potrebbe essere la soluzione a breve termine più semplice per riavviare semplicemente OOo e ricostruire il documento corrente quando viene prodotto un file PDF danneggiato. –

+0

Non sono riuscito a trovare un modo. La dimensione del file è simile, a volte le lettere si diffondono nella pagina, a volte vengono utilizzati i tipi di carattere errati e talvolta il carattere è quello giusto ma viene visualizzato in grassetto. –

risposta

2

Probabilmente finirei per trovare un modo per determinare quando l'elaborazione in batch va in tilt, quindi rielaborare tutto da poco prima che fallisse. Come determinare quando va in tilt? Ciò richiederà analizzando alcuni file PDF corretti e alcuni tra quelli falliti, a cercare somiglianze tra i quali:

  • file generati non sono della misura giusta rispetto alla loro fonte
  • i file non contengono qualche stringa (come il nome del font)
  • alcuni bit di dati non è nel luogo previsto
  • quando convertito torna al testo, che non contengono dati previsti dal modello
  • una volta convertito in una bitmap, testo isn' t nel posto giusto

Ho il sospetto che convertirli di nuovo in testo e cercare le stringhe previste sarà la soluzione più accurata, ma anche lenta. Se è troppo lento per essere eseguito su tutti i file, eseguilo ogni 1/100 o poco più, e ricontrolla ogni file dopo l'ultimo noto.

+0

Non con un semplice grep. L'unico modo in cui posso pensare di rilevarne alcuni è convertire in un formato raster e vedere se è scritto oltre i margini della pagina. Hairy ... –

+0

Penso che la conversione in bitmap e la ricerca di rifiuti nei margini funzionerebbero bene. Se è lento, controlla ogni centesimo o millesimo. Se hai bisogno di aiuto per capire come farlo, basta fare un altro post. Io uso ImageMagick per questo genere di cose tutto il tempo, quindi non è troppo difficile. – Gabe

+0

Sì, in realtà sto studiando se "convert -trim" convogliato in/usr/bin/file funzioni abbastanza bene, quindi ho intenzione di post-processare ogni batch sul server per rifiutare i cattivi alla ricezione. La larghezza della prima pagina è quasi costante per quelli buoni. –

0

Per il tuo scenario sembra che Reportlab PLUS sia una buona soluzione, compresi modelli e supporto telefonico per farti andare veloce.

+0

La versione commerciale di reportlab costa diverse migliaia di sterline in leasing, ogni anno, a seconda del numero di pagine generate (!) E ha un prezzo ancora diverso per il settore finanziario. Non ho questo budget al momento. Quando l'avrò in esecuzione, valuterò. –

0

Problema molto interessante. Dal momento che lo hai già scritto in cluster su più macchine, perché non utilizzare l'approccio di doppia produzione e diffonderlo su nodi EC2. Costerà un po 'di più ma puoi confrontare le cose usando gli hash md5 o sha e se 2 versioni sono le stesse su cui puoi andare avanti.

+0

no, la conversione dello stesso file due volte produce due file binari molto diversi. –

+0

Quindi il processo di conversione non è deterministico? È strano. In che modo il contenuto è diverso? diff può confrontare binario - puoi anche provare questo http://www.melaneum.com/blog/linux/pdf-diff – whatnick

+0

Oh, sono diversi, come questo http://imagebin.ca/view/GcLtXR.html –

0

Per confrontare 2 file PDF, vorrei raccomandare i-net PDF content comparer. Può confrontare 2 directory di file PDF molto bene. Lo usiamo nel nostro sistema di test di regressione.

3

Per la creazione di un numero così grande di file PDF OpenOffice mi sembra il prodotto sbagliato. Dovresti utilizzare una soluzione di reporting reale ottimizzata per la creazione di grandi quantità di file PDF. Ci sono molti strumenti diversi.Vorrei raccomandare i-net Clear Reports (usato per essere chiamato i-net Crystal-Clear).

  • Mi aspetto che un file PDF sia più veloce creato come con OpenOfice.
  • Creare 2 file PDF e confrontarlo costerà molta velocità.
  • Può incorporare tipi di carattere True Type.
  • Con l'API è possibile lavorare in un ciclo.
  • Con una licenza di prova si può lavorare per 90 giorni sul lotto

Gli svantaggi è che è necessario riavviare il vostro sviluppo.

+0

Ho già in programma di riscrivere tutto, lo valuterò. Ma anche se non sono un bigotto open source, il prezzo a seconda del numero di CPU è sicuramente un limite :-) –

Problemi correlati