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>
45 lines
1.6 KiB
JavaScript
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')
|
|
})
|
|
})
|