Generowanie plików PDF za pomocą JavaScript

268

Próbuję przekonwertować dane XML na pliki PDF ze strony internetowej i miałem nadzieję, że zrobię to całkowicie w JavaScript. Potrzebuję umieć rysować tekst, obrazy i proste kształty. Chciałbym móc to zrobić całkowicie w przeglądarce.

ameba
źródło

Odpowiedzi:

446

Właśnie napisałem bibliotekę o nazwie jsPDF, która generuje pliki PDF przy użyciu samego Javascript. Jest wciąż bardzo młody i wkrótce dodam funkcje i poprawki błędów. Otrzymałem również kilka pomysłów na obejścia w przeglądarkach, które nie obsługują identyfikatorów URI danych. Jest licencjonowany na podstawie liberalnej licencji MIT.

Natknąłem się na to pytanie, zanim zacząłem je pisać i pomyślałem, że wrócę i dam znać :)

Generuj pliki PDF w JavaScript

Przykład utwórz plik PDF „Hello World”.

// Default export is a4 paper, portrait, using milimeters for units
var doc = new jsPDF()

doc.text('Hello world!', 10, 10)
doc.save('a4.pdf')
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.5/jspdf.debug.js"></script>

James Hall
źródło
10
Czy częściowo zainspirowałem jsPDF? Dowiedziałem się o jsPDF w dniu, w którym go ogłosiłeś. Jak dotąd świetnie wygląda. Skończyłem z Prawn, ponieważ jest to najlepsza biblioteka do generowania plików PDF na moje potrzeby. Nadal chciałbym wykonywać całą moją pracę w przeglądarce, ponieważ nie jestem pewien, czy dostanę Ruby w systemie, w którym wdrażam. Bardzo uważnie obserwuję jsPDF. Chciałbym pomóc, ale mój czas jest bardzo ograniczony. To może się zmienić w przyszłości.
ameba
7
Zainspirowałeś go trochę :) Rozglądałem się w Internecie, aby sprawdzić, czy już istnieje, i zobaczyłem, że niektórym ludziom się przyda. Daj mi znać, jeśli chcesz pomóc. Jestem @MrRio na Twitterze.
James Hall
23
Nadal jest bardzo żywy. 0.9.0rc2 Wydany dzisiaj.
James Hall,
87
@JamesHall, chciałbym podziękować za całą pracę, jaką trzeba napisać, oraz za licencjonowanie MIT, aby uczynić świat lepszym miejscem, gdy można by go skomercjalizować dla własnego zysku.
Charles Burns,
16
Czy downvoters mogą zaoferować nam swoje „lepsze” pomysły lub rozwiązania? To doskonały wysiłek.
Onur Yıldırım
138

Inną biblioteką javascript, o której warto wspomnieć, jest pdfmake .

Obsługa przeglądarki nie wydaje się być tak silna jak jsPDF, nie ma też opcji kształtów, ale opcje formatowania tekstu są bardziej zaawansowane niż opcje obecnie dostępne w jsPDF.

mg1075
źródło
7
Ta odpowiedź powinna być oceniana znacznie bardziej, pdfmake jest o wiele bardziej solidny niż jspdf. Jednak tylko na marginesie, jest on zawinięty wokół biblioteki PDFKit.
vittore
2
z drugiej strony, jspdf nie obsługuje utf-8, a pdfmake obsługuje utf-8 tylko dla domyślnych czcionek.
Lew
„pdfmake.min.js - 0.1.22 - 9 godzin temu” Nie jest martwy, zaktualizowany tego dnia.
zenbeni
Porównując oba place zabaw, wydaje mi się, że jsPDF jest bardziej ukierunkowany na tworzenie „graficznych” plików PDF, podczas gdy pdfmake jest bardziej ukierunkowany na generowanie dobrze sformatowanych „zwykłych” dokumentów, wydaje się, że ma o wiele więcej opcji dla ogólnego formatowania tekstu.
cslotty
Czy to jest przyjazne IE?
Wildhammer
59

Utrzymuję PDFKit , który również obsługuje pdfmake (wspomniany już tutaj). Działa zarówno w węźle, jak i przeglądarce, i obsługuje wiele rzeczy, których inne biblioteki nie robią:

  • Osadzanie czcionek z podzestawem, z obsługą Unicode.
  • Wiele zaawansowanych elementów układu tekstu (kolumny, łamanie stron, pełne łamanie linii Unicode, podstawowy tekst sformatowany itp.).
  • Praca nad jeszcze większą liczbą czcionek dla zaawansowanej typografii (ligatury OpenType / AAT, podstawianie kontekstowe itp.). Wkrótce: zobacz gałąź fontkit, jeśli jesteś zainteresowany.
  • Więcej elementów graficznych: gradienty itp.
  • Zbudowany przy użyciu nowoczesnych narzędzi, takich jak przeglądanie i strumieniowanie. Można używać zarówno w przeglądarce, jak i węźle.

Sprawdź http://pdfkit.org/, aby uzyskać pełny samouczek, aby zobaczyć na własne oczy, co potrafi PDFKit. A na przykład, jakie rodzaje dokumentów można wytworzyć, sprawdź dokumenty w formacie PDF wygenerowanym z niektórych plików Markdown za pomocą samego PDFKit: http://pdfkit.org/docs/guide.pdf .

Możesz także wypróbować go interaktywnie w przeglądarce tutaj: http://pdfkit.org/demo/browser.html .

devongovett
źródło
Czy to nie jest biblioteka po stronie serwera? Myślę, że dyskusja jest po stronie biblioteki js po stronie klienta.
Ash Catchem
10
PDFKit działa zarówno w węźle, jak i przeglądarce, jak wspomniano w odpowiedzi. Zobacz link do wersji demonstracyjnej przeglądarki.
devongovett,
Czy to kompresuje obrazy? Pracuję nad aplikacją internetową, która działa podobnie jak camscanner i szukam tworzenia plików PDF za pomocą javascript, aby wykorzystać kompresję i format wielostronicowy.
Trevor
@devongovett czy możesz spojrzeć na moje pytanie dotyczące twojej biblioteki?
ninbit
8

Innym interesującym projektem jest texlive.js .

Pozwala skompilować (La) TeX do PDF w przeglądarce.

Kpym
źródło
Przykład hello world renderuje się ładnie, ale jego ukończenie zajmuje około 30 sekund.
Sam Sippe,
2

Możesz skorzystać z tej bezpłatnej usługi, dodając link, który tworzy pdf z dowolnego adresu URL (np. Http://www.phys.org ):

http://freehtmltopdf.com/?convert=http%3A%2F%2Fwww.phys.org&size=US_Letter&orientation=portrait&framesize=800&language=en

boateng
źródło
1
Aktualizacja: Kiedy poszedłem sprawdzić tę usługę freehtmltopdf.com , powiedziałem, że nie jest już dostępna. Wygląda na to, że to było niesamowite!
Mark Duiker,
sprawdzone teraz - działa. i to jest niesamowite, korzystam z usługi, w której płacę za każdy plik pdf i muszę kodować, to jest taki problem.
Siergiej Sob
-29

Nawet jeśli możesz wygenerować plik PDF w pamięci JavaScript, nadal będziesz miał problem z przesłaniem tych danych do użytkownika. JavaScript ma trudności z popchnięciem pliku do użytkownika.

Aby przekazać plik użytkownikowi, należy wykonać przesłanie na serwer, aby przeglądarka otworzyła okno dialogowe zapisywania.

Powiedziawszy to, generowanie plików PDF naprawdę nie jest zbyt trudne. Po prostu przeczytaj specyfikację.

Frank Krueger
źródło
1
To wcale nie jest trudne, na przykład wydaje się, że działa z Data-URI en.wikipedia.org/wiki/Data_URI_scheme (robiłem to wcześniej, ale nie pamiętam, czy użyłem Data-URI).
Björn
58
Teraz możesz łatwo tworzyć pliki w JavaScript. (Jestem z przyszłości)
Derek 朕 會 功夫
5
W dzisiejszych czasach jest naprawdę proste. Sprawdź to na przykład: github.com/ChenWenBrian/FileSaver.js
roy riojas
9
@FrankKrueger, jeśli usuniesz swoją odpowiedź, otrzymasz 6 punktów: P
Kamil Kiełczewski
8
@FrankKreuger, „Idź przeczytaj specyfikację” prawie nigdy nie jest właściwą odpowiedzią na SO.
Krishnan Venkiteswaran