react-pdf
react-pdf copied to clipboard
Custom font causes infinite pending of `toBlob`
Describe the bug
Using custom font will cause an infinite pending of the toBlob
method.
To Reproduce
I've reproduced this in both CRA and Vite project.
To reproduce it:
- register and use some font (just registering will not trigger this)
- invoke the
toBlob
method of the PDF instance
An example:
import { pdf, Document, Page, Text, View, Font } from "@react-pdf/renderer";
export const run = async () => {
const dom = () => {
return (
<Document>
<Page>
<View>
<Text style={{ fontFamily: "SomeFont" }}>Test</Text>
{/* <Text style={{ fontFamily: "Helvetica" }}>Test</Text> */}
</View>
</Page>
</Document>
);
};
Font.register({
family: "SomeFont",
src: "/assets/Roboto-Regular.ttf",
});
pdf(dom())
.toBlob()
.then((blob) => {
console.log(blob);
})
.catch((err) => {
console.error(err);
});
};
P.S. once use the builtin Helvetica
the blob could be properly generated.
I've dived into the root cause, and it seems it's related to the _fontFamily
property of the PDFDocument
Custom font seems not to be properly added to the _fontFamily
, thus related PDFReference
will not be finalized on the document's ending. In packages/pdfkit/src/mixins/fonts.js:64-66
, the _font.name
is null
for a custom font, so it would not be added to the _fontFamilies
and will not be finalized in packages/pdfkit/src/document.js:262-265
.
As for the _font.name
, I found the initializing in packages/pdfkit/src/font/embedded.js:21
, and the postscriptName
seems to be initialized in the constructor of FontSource
. While I tryed add a postscriptName
to the option of register, an error was thrown:
Error: Variations require a font with the fvar, gvar and glyf, or CFF2 tables.
Any idea on it? Please let know if this is a misusage.
Version Used
-
renderer
: 3.4.4 -
fns
: 2.2.1 -
font
: 2.5.1 -
layout
: 3.12.1 -
pdfkit
: 3.1.10 -
primitives
: 3.1.1 -
render
: 3.4.4 -
stylesheet
: 4.2.5 -
textkit
: 4.4.1 -
types
: 2.5.0