1
0
Fork 0

fix(shared): Import logo from the correct place

This commit is contained in:
Joost De Cock 2022-10-06 00:48:57 +02:00
parent 4ea391ba91
commit 7c4565b52a

View file

@ -1,11 +1,11 @@
import PDFDocument from 'pdfkit/js/pdfkit.standalone' import PDFDocument from 'pdfkit/js/pdfkit.standalone'
import SVGtoPDF from 'svg-to-pdfkit' import SVGtoPDF from 'svg-to-pdfkit'
import {logo} from '@freesewing/plugin-logo' import { path as logoPath } from '../icons/freesewing.js'
/** an svg of the logo to put on the cover page */ /** an svg of the logo to put on the cover page */
const logoSvg = `<svg viewBox="-22 -36 46 50"> const logoSvg = `<svg viewBox="-22 -36 46 50">
<style> path {fill: none; stroke: #555555; stroke-width: 0.5} </style> <style> path {fill: none; stroke: #555555; stroke-width: 0.5} </style>
${logo} <path d=${logoPath} />
</svg>` </svg>`
/** /**
@ -19,187 +19,187 @@ const mmToPoints = 2.834645669291339
* handles pdf exporting * handles pdf exporting
*/ */
export default class PdfMaker { export default class PdfMaker {
/** the svg as text to embed in the pdf */ /** the svg as text to embed in the pdf */
svg svg
/** the document configuration */ /** the document configuration */
settings settings
/** the pdfKit instance that is writing the document */ /** the pdfKit instance that is writing the document */
pdf pdf
/** the export buffer to hold pdfKit output */ /** the export buffer to hold pdfKit output */
buffers buffers
/** translated strings to add to the cover page */ /** translated strings to add to the cover page */
strings strings
/** the usable width (excluding margin) of the pdf page, in points */ /** the usable width (excluding margin) of the pdf page, in points */
pageWidth pageWidth
/** the usable height (excluding margin) of the pdf page, in points */ /** the usable height (excluding margin) of the pdf page, in points */
pageHeight pageHeight
/** the page margin, in points */ /** the page margin, in points */
margin margin
/** the number of columns of pages in the svg */ /** the number of columns of pages in the svg */
columns columns
/** the number of rows of pages in the svg */ /** the number of rows of pages in the svg */
rows rows
/** the width of the entire svg, in points */ /** the width of the entire svg, in points */
svgWidth svgWidth
/** the height of the entire svg, in points */ /** the height of the entire svg, in points */
svgHeight svgHeight
pageCount = 0 pageCount = 0
constructor({svg, settings, pages, strings}) { constructor({ svg, settings, pages, strings }) {
this.settings = settings this.settings = settings
this.pagesWithContent = pages.withContent; this.pagesWithContent = pages.withContent
this.svg = svg this.svg = svg
this.strings = strings this.strings = strings
this.initPdf() this.initPdf()
this.margin = this.settings.margin * mmToPoints // margin is in mm because it comes from us, so we convert it to points this.margin = this.settings.margin * mmToPoints // margin is in mm because it comes from us, so we convert it to points
this.pageHeight = this.pdf.page.height - this.margin * 2 // this is in points because it comes from pdfKit this.pageHeight = this.pdf.page.height - this.margin * 2 // this is in points because it comes from pdfKit
this.pageWidth = this.pdf.page.width - this.margin * 2 // this is in points because it comes from pdfKit this.pageWidth = this.pdf.page.width - this.margin * 2 // this is in points because it comes from pdfKit
// get the pages data // get the pages data
this.columns = pages.cols this.columns = pages.cols
this.rows = pages.rows this.rows = pages.rows
// calculate the width of the svg in points // calculate the width of the svg in points
this.svgWidth = this.columns * pages.width * mmToPoints this.svgWidth = this.columns * pages.width * mmToPoints
this.svgHeight = this.rows * pages.height * mmToPoints this.svgHeight = this.rows * pages.height * mmToPoints
} }
/** create the pdf document */
initPdf() {
// instantiate with the correct size and orientation
this.pdf = new PDFDocument({
size: this.settings.size.toUpperCase(),
layout: this.settings.orientation,
})
/** create the pdf document */ // PdfKit wants to flush the buffer on each new page.
initPdf() { // We can't save directly from inside a worker, so we have to manage the buffers ourselves so we can return a blob
// instantiate with the correct size and orientation this.buffers = []
this.pdf = new PDFDocument({
size: this.settings.size.toUpperCase(),
layout: this.settings.orientation
})
// PdfKit wants to flush the buffer on each new page. // use a listener to add new data to our buffer storage
// We can't save directly from inside a worker, so we have to manage the buffers ourselves so we can return a blob this.pdf.on('data', this.buffers.push.bind(this.buffers))
this.buffers = []; }
// use a listener to add new data to our buffer storage /** make the pdf */
this.pdf.on('data', this.buffers.push.bind(this.buffers)); async makePdf() {
} await this.generateCoverPage()
await this.generatePages()
}
/** make the pdf */ /** convert the pdf to a blob */
async makePdf() { toBlob() {
await this.generateCoverPage() return new Promise((resolve) => {
await this.generatePages(); // have to do it this way so that the document flushes everything to buffers
} this.pdf.on('end', () => {
// convert buffers to a blob
resolve(
new Blob(this.buffers, {
type: 'application/pdf',
})
)
})
/** convert the pdf to a blob */ // end the stream
toBlob() { this.pdf.end()
return new Promise((resolve) => { })
// have to do it this way so that the document flushes everything to buffers }
this.pdf.on('end', () => {
// convert buffers to a blob
resolve(new Blob(this.buffers, {
type: 'application/pdf'
}))
});
// end the stream /** generate the cover page for the pdf */
this.pdf.end() async generateCoverPage() {
}) // don't make one if it's not requested
} if (!this.settings.coverPage) {
return
}
/** generate the cover page for the pdf */ const headerLevel = await this.generateCoverPageTitle()
async generateCoverPage() {
// don't make one if it's not requested //abitrary margin for visual space
if (!this.settings.coverPage) { let coverMargin = 85
return let coverHeight = this.pdf.page.height - coverMargin * 2 - headerLevel
} let coverWidth = this.pdf.page.width - coverMargin * 2
const headerLevel = await this.generateCoverPageTitle() // add the entire pdf to the page, so that it fills the available space as best it can
await SVGtoPDF(this.pdf, this.svg, coverMargin, headerLevel + coverMargin, {
width: coverWidth,
height: coverHeight,
assumePt: false,
// use aspect ratio to center it
preserveAspectRatio: 'xMidYMid meet',
})
this.pageCount++
}
//abitrary margin for visual space async generateCoverPageTitle() {
let coverMargin = 85 let lineLevel = 50
let coverHeight = this.pdf.page.height - coverMargin * 2 - headerLevel let lineStart = 50
let coverWidth = this.pdf.page.width - coverMargin * 2
// add the entire pdf to the page, so that it fills the available space as best it can this.pdf.fontSize(28)
await SVGtoPDF(this.pdf, this.svg, coverMargin, headerLevel + coverMargin, { this.pdf.text('FreeSewing', lineStart, lineLevel)
width: coverWidth, lineLevel += 28
height: coverHeight,
assumePt: false,
// use aspect ratio to center it
preserveAspectRatio: 'xMidYMid meet'
});
this.pageCount++
}
async generateCoverPageTitle() { this.pdf.fontSize(12)
let lineLevel = 50 this.pdf.text(this.strings.tagline, lineStart, lineLevel)
let lineStart = 50 lineLevel += 12 + 20
this.pdf.fontSize(28) this.pdf.fontSize(48)
this.pdf.text('FreeSewing', lineStart, lineLevel) this.pdf.text(this.strings.design, lineStart, lineLevel)
lineLevel += 28 lineLevel += 48
this.pdf.fontSize(12) await SVGtoPDF(this.pdf, logoSvg, this.pdf.page.width - lineStart - 100, lineStart, {
this.pdf.text(this.strings.tagline, lineStart, lineLevel) width: 100,
lineLevel += 12 + 20 height: lineLevel - lineStart - 8,
preserveAspectRatio: 'xMaxYMin meet',
})
this.pdf.lineWidth(1)
this.pdf
.moveTo(lineStart, lineLevel - 8)
.lineTo(this.pdf.page.width - lineStart, lineLevel - 8)
.stroke()
this.pdf.fontSize(48) this.pdf.fillColor('#888888')
this.pdf.text(this.strings.design, lineStart, lineLevel) this.pdf.fontSize(10)
lineLevel += 48 this.pdf.text(this.strings.url, lineStart, lineLevel)
await SVGtoPDF(this.pdf, logoSvg, this.pdf.page.width - lineStart - 100, lineStart, { return lineLevel
width: 100, }
height: lineLevel - lineStart - 8,
preserveAspectRatio: 'xMaxYMin meet'
})
this.pdf.lineWidth(1) /** generate the pages of the pdf */
this.pdf.moveTo(lineStart, lineLevel - 8) async generatePages() {
.lineTo(this.pdf.page.width - lineStart, lineLevel - 8) // pass the same options to the svg converter for each page
.stroke() const options = {
assumePt: true,
width: this.svgWidth,
height: this.svgHeight,
preserveAspectRatio: 'xMinYMin slice',
}
this.pdf.fillColor('#888888') // everything is offset by half a margin so that it's centered on the page
this.pdf.fontSize(10) const startMargin = this.margin
this.pdf.text(this.strings.url, lineStart, lineLevel) for (var h = 0; h < this.rows; h++) {
for (var w = 0; w < this.columns; w++) {
// skip empty pages
if (!this.pagesWithContent[h][w]) continue
return lineLevel // position it
} let x = -w * this.pageWidth + startMargin
let y = -h * this.pageHeight + startMargin
/** generate the pages of the pdf */ // if there was no cover page, the first page already exists
async generatePages() { if (this.pageCount > 0) {
// pass the same options to the svg converter for each page // otherwise make a new page
const options = { this.pdf.addPage()
assumePt: true, }
width: this.svgWidth,
height: this.svgHeight,
preserveAspectRatio: 'xMinYMin slice',
}
// everything is offset by half a margin so that it's centered on the page // add the pdf to the page, offset by the page distances
const startMargin = this.margin await SVGtoPDF(this.pdf, this.svg, x, y, options)
for (var h = 0; h < this.rows; h++) { this.pageCount++
for (var w = 0; w < this.columns; w++) { }
// skip empty pages }
if (!this.pagesWithContent[h][w]) continue; }
// position it
let x = -w * this.pageWidth + startMargin
let y = -h * this.pageHeight + startMargin
// if there was no cover page, the first page already exists
if (this.pageCount > 0) {
// otherwise make a new page
this.pdf.addPage()
}
// add the pdf to the page, offset by the page distances
await SVGtoPDF(this.pdf, this.svg, x, y, options)
this.pageCount++;
}
}
}
} }