Files
pdf_oralia_vibe/frontend/tests/pdfPreview.test.js
Bertrand Benjamin e2e2f5bc0e feat(apercu): revient au lecteur PDF natif du moteur
Le rendu maison sur <canvas> dimensionnait chaque page à la largeur du
volet, sans jamais pouvoir aller au-delà : sur une page A4 (595,3 pt) dans
un volet de 495 px — soit 40 % d'une fenêtre bureau de 1280 px — cela
faisait une échelle de 0,83x, et les tableaux du CRG composés en 7 pt
tombaient à 5,8 px de haut. Illisible, sans recours : aucun zoom, aucun
re-rendu au redimensionnement (la canvas était simplement étirée en CSS),
et devicePixelRatio à 1 sur écran non-HiDPI, donc aucun suréchantillonnage.

L'<iframe> rend au moteur le zoom, la recherche, l'impression et la
sélection de texte, tous absents jusqu'ici, et redessine à chaque niveau
de zoom. Le document s'ouvre à `#zoom=100` : « ajuster à la largeur » ne
sauverait rien dans un volet étroit (54 %, soit 5 px pour du 7 pt) alors
qu'à 100 % le 7 pt fait 9,3 px. Les mots-clés `page-width`, `view=FitH` et
`pagemode=none` sont ignorés par le lecteur de Chrome ; une valeur
numérique est honorée.

Un lien « ouvrir dans un nouvel onglet » sert de porte de sortie si le
moteur n'embarque pas de lecteur PDF.

pdfjs-dist n'a plus d'utilisateur : bundle principal 966 Ko -> 492 Ko, et
le worker de 1,3 Mo n'est plus émis.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 21:12:58 +02:00

45 lines
1.6 KiB
JavaScript

// L'apercu sert a relire le compte rendu ligne a ligne pendant qu'on corrige
// l'extraction : ce qui compte est qu'il s'ouvre a une echelle lisible, pas
// qu'il tienne entier dans le volet.
import { describe, expect, it } from 'vitest'
import { createSSRApp } from 'vue'
import { renderToString } from 'vue/server-renderer'
import PdfPreview from '../src/components/PdfPreview.vue'
function rendu(proprietes = {}) {
return renderToString(createSSRApp(PdfPreview, proprietes))
}
describe('PdfPreview', () => {
it('ouvre le document a l echelle 1:1', async () => {
// Le zoom par defaut du lecteur integre tombe vers 35 % dans un volet
// etroit, ce qui reduit les tableaux du CRG (7 pt) a 3 px de haut. A 100 %
// ils font 9,3 px et redeviennent lisibles, quitte a devoir defiler.
const html = await rendu({ url: '/api/documents/37/pdf' })
expect(html).toContain('/api/documents/37/pdf#zoom=100')
})
it('annonce l absence de document plutot qu un cadre vide', async () => {
const html = await rendu()
expect(html).toContain('Aucun PDF sélectionné')
expect(html).not.toContain('<iframe')
})
it('offre d ouvrir le PDF hors du volet', async () => {
// Seule issue quand le moteur n'embarque pas de lecteur PDF : sans ce
// lien, le volet resterait vide sans recours.
const html = await rendu({ url: '/api/documents/37/pdf' })
expect(html).toContain('target="_blank"')
})
it('affiche le nom du fichier relu', async () => {
const html = await rendu({ url: '/api/documents/37/pdf', fileName: '2026 07 Servient.pdf' })
expect(html).toContain('2026 07 Servient.pdf')
})
})