diegomura / diegomura/react-pdf
Custom font causes infinite pending of `toBlob`
- Dominant language
- TypeScript
- Stars
- 16.8k
- Forks
- 1.3k
- Avg merge
- 5h 6m
- Merged PRs (30d)
- 52
Description
**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:
1. register and **use** some font (just registering will not trigger this)
2. invoke the `toBlob` method of the PDF instance
An example:
```tsx
import { pdf, Document, Page, Text, View, Font } from "@react-pdf/renderer";
export const run = async () => {
const dom = () => {
return (
Test
{/* Test */}
);
};
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:
```shell
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
Contributor guide
Assessment
This issue has not been assessed yet.