parent
d7e0f6354f
commit
ef7107cc43
@ -0,0 +1,72 @@ |
|||||||
|
import jsPDF from 'jspdf' |
||||||
|
import 'svg2pdf.js' |
||||||
|
|
||||||
|
const jsPdf = new jsPDF('landscape', 'px', 'a4') |
||||||
|
|
||||||
|
interface IUmlDownloadStrategy { |
||||||
|
download (uml: string, fileName: string): void |
||||||
|
} |
||||||
|
|
||||||
|
export type UmlFileType = 'pdf' | 'png' |
||||||
|
|
||||||
|
class PdfUmlDownloadStrategy implements IUmlDownloadStrategy { |
||||||
|
doc: jsPDF |
||||||
|
constructor(pdf: jsPDF) { |
||||||
|
this.doc = pdf |
||||||
|
} |
||||||
|
public download (uml: string, fileName: string): void { |
||||||
|
const parser = new DOMParser() |
||||||
|
const parsedDocument = parser.parseFromString(uml, 'image/svg+xml') |
||||||
|
const element = parsedDocument.getElementsByTagName('svg')[0] |
||||||
|
this.doc.svg(element, { |
||||||
|
x: 20, |
||||||
|
y: 20, |
||||||
|
width: this.doc.internal.pageSize.getWidth() - 20, |
||||||
|
height: this.doc.internal.pageSize.getHeight() - 40 |
||||||
|
}).then(() => { |
||||||
|
this.doc.save(fileName.split('/')[1].split('.')[0].concat('.pdf')) |
||||||
|
}).catch((err) => { |
||||||
|
console.log(err) |
||||||
|
}) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class ImageUmlDownloadStrategy implements IUmlDownloadStrategy { |
||||||
|
public download (uml: string, fileName: string): void { |
||||||
|
const svg = new Blob([uml], { type: 'image/svg+xml;charset=utf-8' }) |
||||||
|
const url = URL.createObjectURL(svg) |
||||||
|
const img = new Image() |
||||||
|
img.onload = () => { |
||||||
|
const canvas = document.createElement('canvas') |
||||||
|
canvas.width = img.width |
||||||
|
canvas.height = img.height |
||||||
|
const ctx = canvas.getContext('2d') |
||||||
|
ctx.drawImage(img, 0, 0) |
||||||
|
const png = canvas.toDataURL('image/png') |
||||||
|
const a = document.createElement('a') |
||||||
|
a.download = fileName.split('/')[1].split('.')[0].concat('.png') |
||||||
|
a.href = png |
||||||
|
a.click() |
||||||
|
} |
||||||
|
img.src = url |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
export class UmlDownloadContext { |
||||||
|
private strategy: IUmlDownloadStrategy |
||||||
|
|
||||||
|
private setStrategy (strategy: IUmlDownloadStrategy): void { |
||||||
|
this.strategy = strategy |
||||||
|
} |
||||||
|
|
||||||
|
public download (uml: string, fileName: string, fileType: UmlFileType ): void { |
||||||
|
if (fileType === 'pdf') { |
||||||
|
this.setStrategy(new PdfUmlDownloadStrategy(jsPdf)) |
||||||
|
} else if (fileType === 'png') { |
||||||
|
this.setStrategy(new ImageUmlDownloadStrategy()) |
||||||
|
} else { |
||||||
|
throw new Error('Invalid file type') |
||||||
|
} |
||||||
|
this.strategy.download(uml, fileName) |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue