Pelajari lebih lanjut di pdf-lib.js.org
pdf-lib
dibuat untuk mengatasi kurangnya dukungan kuat ekosistem JavaScript untuk manipulasi PDF (terutama untuk modifikasi PDF).
Dua fitur pembeda pdf-lib
adalah:
Ada perpustakaan PDF JavaScript open source bagus lainnya yang tersedia. Namun kebanyakan dari mereka hanya bisa membuat dokumen, tidak bisa memodifikasi yang sudah ada. Dan banyak dari mereka hanya bekerja di lingkungan tertentu.
Contoh ini menghasilkan PDF ini.
Coba demo JSFiddle
import { PDFDocument , StandardFonts , rgb } from 'pdf-lib'
// Create a new PDFDocument
const pdfDoc = await PDFDocument . create ( )
// Embed the Times Roman font
const timesRomanFont = await pdfDoc . embedFont ( StandardFonts . TimesRoman )
// Add a blank page to the document
const page = pdfDoc . addPage ( )
// Get the width and height of the page
const { width , height } = page . getSize ( )
// Draw a string of text toward the top of the page
const fontSize = 30
page . drawText ( 'Creating PDFs in JavaScript is awesome!' , {
x : 50 ,
y : height - 4 * fontSize ,
size : fontSize ,
font : timesRomanFont ,
color : rgb ( 0 , 0.53 , 0.71 ) ,
} )
// Serialize the PDFDocument to bytes (a Uint8Array)
const pdfBytes = await pdfDoc . save ( )
// For example, `pdfBytes` can be:
// • Written to a file in Node
// • Downloaded from the browser
// • Rendered in an <iframe>
Contoh ini menghasilkan PDF ini (ketika PDF ini digunakan untuk variabelPdfBytes existingPdfBytes
).
Coba demo JSFiddle
import { degrees , PDFDocument , rgb , StandardFonts } from 'pdf-lib' ;
// This should be a Uint8Array or ArrayBuffer
// This data can be obtained in a number of different ways
// If your running in a Node environment, you could use fs.readFile()
// In the browser, you could make a fetch() call and use res.arrayBuffer()
const existingPdfBytes = ...
// Load a PDFDocument from the existing PDF bytes
const pdfDoc = await PDFDocument . load ( existingPdfBytes )
// Embed the Helvetica font
const helveticaFont = await pdfDoc . embedFont ( StandardFonts . Helvetica )
// Get the first page of the document
const pages = pdfDoc . getPages ( )
const firstPage = pages [ 0 ]
// Get the width and height of the first page
const { width , height } = firstPage . getSize ( )
// Draw a string of text diagonally across the first page
firstPage . drawText ( 'This text was added with JavaScript!' , {
x : 5 ,
y : height / 2 + 300 ,
size : 50 ,
font : helveticaFont ,
color : rgb ( 0.95 , 0.1 , 0.1 ) ,
rotate : degrees ( - 45 ) ,
} )
// Serialize the PDFDocument to bytes (a Uint8Array)
const pdfBytes = await pdfDoc . save ( )
// For example, `pdfBytes` can be:
// • Written to a file in Node
// • Downloaded from the browser
// • Rendered in an <iframe>
Contoh ini menghasilkan PDF ini.
Coba demo JSFiddle
Lihat juga Membuat dan Mengisi Formulir
import { PDFDocument } from 'pdf-lib'
// Create a new PDFDocument
const pdfDoc = await PDFDocument . create ( )
// Add a blank page to the document
const page = pdfDoc . addPage ( [ 550 , 750 ] )
// Get the form so we can add fields to it
const form = pdfDoc . getForm ( )
// Add the superhero text field and description
page . drawText ( 'Enter your favorite superhero:' , { x : 50 , y : 700 , size : 20 } )
const superheroField = form . createTextField ( 'favorite.superhero' )
superheroField . setText ( 'One Punch Man' )
superheroField . addToPage ( page , { x : 55 , y : 640 } )
// Add the rocket radio group, labels, and description
page . drawText ( 'Select your favorite rocket:' , { x : 50 , y : 600 , size : 20 } )
page . drawText ( 'Falcon Heavy' , { x : 120 , y : 560 , size : 18 } )
page . drawText ( 'Saturn IV' , { x : 120 , y : 500 , size : 18 } )
page . drawText ( 'Delta IV Heavy' , { x : 340 , y : 560 , size : 18 } )
page . drawText ( 'Space Launch System' , { x : 340 , y : 500 , size : 18 } )
const rocketField = form . createRadioGroup ( 'favorite.rocket' )
rocketField . addOptionToPage ( 'Falcon Heavy' , page , { x : 55 , y : 540 } )
rocketField . addOptionToPage ( 'Saturn IV' , page , { x : 55 , y : 480 } )
rocketField . addOptionToPage ( 'Delta IV Heavy' , page , { x : 275 , y : 540 } )
rocketField . addOptionToPage ( 'Space Launch System' , page , { x : 275 , y : 480 } )
rocketField . select ( 'Saturn IV' )
// Add the gundam check boxes, labels, and description
page . drawText ( 'Select your favorite gundams:' , { x : 50 , y : 440 , size : 20 } )
page . drawText ( 'Exia' , { x : 120 , y : 400 , size : 18 } )
page . drawText ( 'Kyrios' , { x : 120 , y : 340 , size : 18 } )
page . drawText ( 'Virtue' , { x : 340 , y : 400 , size : 18 } )
page . drawText ( 'Dynames' , { x : 340 , y : 340 , size : 18 } )
const exiaField = form . createCheckBox ( 'gundam.exia' )
const kyriosField = form . createCheckBox ( 'gundam.kyrios' )
const virtueField = form . createCheckBox ( 'gundam.virtue' )
const dynamesField = form . createCheckBox ( 'gundam.dynames' )
exiaField . addToPage ( page , { x : 55 , y : 380 } )
kyriosField . addToPage ( page , { x : 55 , y : 320 } )
virtueField . addToPage ( page , { x : 275 , y : 380 } )
dynamesField . addToPage ( page , { x : 275 , y : 320 } )
exiaField . check ( )
dynamesField . check ( )
// Add the planet dropdown and description
page . drawText ( 'Select your favorite planet*:' , { x : 50 , y : 280 , size : 20 } )
const planetsField = form . createDropdown ( 'favorite.planet' )
planetsField . addOptions ( [ 'Venus' , 'Earth' , 'Mars' , 'Pluto' ] )
planetsField . select ( 'Pluto' )
planetsField . addToPage ( page , { x : 55 , y : 220 } )
// Add the person option list and description
page . drawText ( 'Select your favorite person:' , { x : 50 , y : 180 , size : 18 } )
const personField = form . createOptionList ( 'favorite.person' )
personField . addOptions ( [
'Julius Caesar' ,
'Ada Lovelace' ,
'Cleopatra' ,
'Aaron Burr' ,
'Mark Antony' ,
] )
personField . select ( 'Ada Lovelace' )
personField . addToPage ( page , { x : 55 , y : 70 } )
// Just saying...
page . drawText ( `* Pluto should be a planet too!` , { x : 15 , y : 15 , size : 15 } )
// Serialize the PDFDocument to bytes (a Uint8Array)
const pdfBytes = await pdfDoc . save ( )
// For example, `pdfBytes` can be:
// • Written to a file in Node
// • Downloaded from the browser
// • Rendered in an <iframe>
Contoh ini menghasilkan PDF ini (bila PDF ini digunakan untuk variabel formPdfBytes
, gambar ini digunakan untuk variabel marioImageBytes
, dan gambar ini digunakan untuk variabel emblemImageBytes
).
Coba demo JSFiddle
Lihat juga Membuat dan Mengisi Formulir
import { PDFDocument } from 'pdf-lib'
// These should be Uint8Arrays or ArrayBuffers
// This data can be obtained in a number of different ways
// If your running in a Node environment, you could use fs.readFile()
// In the browser, you could make a fetch() call and use res.arrayBuffer()
const formPdfBytes = ...
const marioImageBytes = ...
const emblemImageBytes = ...
// Load a PDF with form fields
const pdfDoc = await PDFDocument . load ( formPdfBytes )
// Embed the Mario and emblem images
const marioImage = await pdfDoc . embedPng ( marioImageBytes )
const emblemImage = await pdfDoc . embedPng ( emblemImageBytes )
// Get the form containing all the fields
const form = pdfDoc . getForm ( )
// Get all fields in the PDF by their names
const nameField = form . getTextField ( 'CharacterName 2' )
const ageField = form . getTextField ( 'Age' )
const heightField = form . getTextField ( 'Height' )
const weightField = form . getTextField ( 'Weight' )
const eyesField = form . getTextField ( 'Eyes' )
const skinField = form . getTextField ( 'Skin' )
const hairField = form . getTextField ( 'Hair' )
const alliesField = form . getTextField ( 'Allies' )
const factionField = form . getTextField ( 'FactionName' )
const backstoryField = form . getTextField ( 'Backstory' )
const traitsField = form . getTextField ( 'Feat+Traits' )
const treasureField = form . getTextField ( 'Treasure' )
const characterImageField = form . getButton ( 'CHARACTER IMAGE' )
const factionImageField = form . getTextField ( 'Faction Symbol Image' )
// Fill in the basic info fields
nameField . setText ( 'Mario' )
ageField . setText ( '24 years' )
heightField . setText ( `5' 1"` )
weightField . setText ( '196 lbs' )
eyesField . setText ( 'blue' )
skinField . setText ( 'white' )
hairField . setText ( 'brown' )
// Fill the character image field with our Mario image
characterImageField . setImage ( marioImage )
// Fill in the allies field
alliesField . setText (
[
`Allies:` ,
` • Princess Daisy` ,
` • Princess Peach` ,
` • Rosalina` ,
` • Geno` ,
` • Luigi` ,
` • Donkey Kong` ,
` • Yoshi` ,
` • Diddy Kong` ,
`` ,
`Organizations:` ,
` • Italian Plumbers Association` ,
] . join ( 'n' ) ,
)
// Fill in the faction name field
factionField . setText ( `Mario's Emblem` )
// Fill the faction image field with our emblem image
factionImageField . setImage ( emblemImage )
// Fill in the backstory field
backstoryField . setText (
`Mario is a fictional character in the Mario video game franchise, owned by Nintendo and created by Japanese video game designer Shigeru Miyamoto. Serving as the company's mascot and the eponymous protagonist of the series, Mario has appeared in over 200 video games since his creation. Depicted as a short, pudgy, Italian plumber who resides in the Mushroom Kingdom, his adventures generally center upon rescuing Princess Peach from the Koopa villain Bowser. His younger brother and sidekick is Luigi.` ,
)
// Fill in the traits field
traitsField . setText (
[
`Mario can use three basic three power-ups:` ,
` • the Super Mushroom, which causes Mario to grow larger` ,
` • the Fire Flower, which allows Mario to throw fireballs` ,
` • the Starman, which gives Mario temporary invincibility` ,
] . join ( 'n' ) ,
)
// Fill in the treasure field
treasureField . setText ( [ '• Gold coins' , '• Treasure chests' ] . join ( 'n' ) )
// Serialize the PDFDocument to bytes (a Uint8Array)
const pdfBytes = await pdfDoc . save ( )
// For example, `pdfBytes` can be:
// • Written to a file in Node
// • Downloaded from the browser
// • Rendered in an <iframe>
Contoh ini menghasilkan PDF ini (ketika PDF ini digunakan untuk variabel formPdfBytes
).
Coba demo JSFiddle
import { PDFDocument } from 'pdf-lib'
// This should be a Uint8Array or ArrayBuffer
// This data can be obtained in a number of different ways
// If your running in a Node environment, you could use fs.readFile()
// In the browser, you could make a fetch() call and use res.arrayBuffer()
const formPdfBytes = ...
// Load a PDF with form fields
const pdfDoc = await PDFDocument . load ( formPdfBytes )
// Get the form containing all the fields
const form = pdfDoc . getForm ( )
// Fill the form's fields
form . getTextField ( 'Text1' ) . setText ( 'Some Text' ) ;
form . getRadioGroup ( 'Group2' ) . select ( 'Choice1' ) ;
form . getRadioGroup ( 'Group3' ) . select ( 'Choice3' ) ;
form . getRadioGroup ( 'Group4' ) . select ( 'Choice1' ) ;
form . getCheckBox ( 'Check Box3' ) . check ( ) ;
form . getCheckBox ( 'Check Box4' ) . uncheck ( ) ;
form . getDropdown ( 'Dropdown7' ) . select ( 'Infinity' ) ;
form . getOptionList ( 'List Box6' ) . select ( 'Honda' ) ;
// Flatten the form's fields
form . flatten ( ) ;
// Serialize the PDFDocument to bytes (a Uint8Array)
const pdfBytes = await pdfDoc . save ( )
// For example, `pdfBytes` can be:
// • Written to a file in Node
// • Downloaded from the browser
// • Rendered in an <iframe>
Contoh ini menghasilkan PDF ini (ketika PDF ini digunakan untuk variabel firstDonorPdfBytes
dan PDF ini digunakan untuk variabel secondDonorPdfBytes
).
Coba demo JSFiddle
import { PDFDocument } from 'pdf-lib'
// Create a new PDFDocument
const pdfDoc = await PDFDocument . create ( )
// These should be Uint8Arrays or ArrayBuffers
// This data can be obtained in a number of different ways
// If your running in a Node environment, you could use fs.readFile()
// In the browser, you could make a fetch() call and use res.arrayBuffer()
const firstDonorPdfBytes = ...
const secondDonorPdfBytes = ...
// Load a PDFDocument from each of the existing PDFs
const firstDonorPdfDoc = await PDFDocument . load ( firstDonorPdfBytes )
const secondDonorPdfDoc = await PDFDocument . load ( secondDonorPdfBytes )
// Copy the 1st page from the first donor document, and
// the 743rd page from the second donor document
const [ firstDonorPage ] = await pdfDoc . copyPages ( firstDonorPdfDoc , [ 0 ] )
const [ secondDonorPage ] = await pdfDoc . copyPages ( secondDonorPdfDoc , [ 742 ] )
// Add the first copied page
pdfDoc . addPage ( firstDonorPage )
// Insert the second copied page to index 0, so it will be the
// first page in `pdfDoc`
pdfDoc . insertPage ( 0 , secondDonorPage )
// Serialize the PDFDocument to bytes (a Uint8Array)
const pdfBytes = await pdfDoc . save ( )
// For example, `pdfBytes` can be:
// • Written to a file in Node
// • Downloaded from the browser
// • Rendered in an <iframe>
Contoh ini menghasilkan PDF ini (ketika gambar ini digunakan untuk variabel jpgImageBytes
dan gambar ini digunakan untuk variabel pngImageBytes
).
Coba demo JSFiddle
import { PDFDocument } from 'pdf-lib'
// These should be Uint8Arrays or ArrayBuffers
// This data can be obtained in a number of different ways
// If your running in a Node environment, you could use fs.readFile()
// In the browser, you could make a fetch() call and use res.arrayBuffer()
const jpgImageBytes = ...
const pngImageBytes = ...
// Create a new PDFDocument
const pdfDoc = await PDFDocument . create ( )
// Embed the JPG image bytes and PNG image bytes
const jpgImage = await pdfDoc . embedJpg ( jpgImageBytes )
const pngImage = await pdfDoc . embedPng ( pngImageBytes )
// Get the width/height of the JPG image scaled down to 25% of its original size
const jpgDims = jpgImage . scale ( 0.25 )
// Get the width/height of the PNG image scaled down to 50% of its original size
const pngDims = pngImage . scale ( 0.5 )
// Add a blank page to the document
const page = pdfDoc . addPage ( )
// Draw the JPG image in the center of the page
page . drawImage ( jpgImage , {
x : page . getWidth ( ) / 2 - jpgDims . width / 2 ,
y : page . getHeight ( ) / 2 - jpgDims . height / 2 ,
width : jpgDims . width ,
height : jpgDims . height ,
} )
// Draw the PNG image near the lower right corner of the JPG image
page . drawImage ( pngImage , {
x : page . getWidth ( ) / 2 - pngDims . width / 2 + 75 ,
y : page . getHeight ( ) / 2 - pngDims . height ,
width : pngDims . width ,
height : pngDims . height ,
} )
// Serialize the PDFDocument to bytes (a Uint8Array)
const pdfBytes = await pdfDoc . save ( )
// For example, `pdfBytes` can be:
// • Written to a file in Node
// • Downloaded from the browser
// • Rendered in an <iframe>
Contoh ini menghasilkan PDF ini (ketika PDF ini digunakan untuk variabel americanFlagPdfBytes
dan PDF ini digunakan untuk variabel usConstitutionPdfBytes
).
Coba demo JSFiddle
import { PDFDocument } from 'pdf-lib'
// These should be Uint8Arrays or ArrayBuffers
// This data can be obtained in a number of different ways
// If your running in a Node environment, you could use fs.readFile()
// In the browser, you could make a fetch() call and use res.arrayBuffer()
const americanFlagPdfBytes = ...
const usConstitutionPdfBytes = ...
// Create a new PDFDocument
const pdfDoc = await PDFDocument . create ( )
// Embed the American flag PDF bytes
const [ americanFlag ] = await pdfDoc . embedPdf ( americanFlagPdfBytes )
// Load the U.S. constitution PDF bytes
const usConstitutionPdf = await PDFDocument . load ( usConstitutionPdfBytes )
// Embed the second page of the constitution and clip the preamble
const preamble = await pdfDoc . embedPage ( usConstitutionPdf . getPages ( ) [ 1 ] , {
left : 55 ,
bottom : 485 ,
right : 300 ,
top : 575 ,
} )
// Get the width/height of the American flag PDF scaled down to 30% of
// its original size
const americanFlagDims = americanFlag . scale ( 0.3 )
// Get the width/height of the preamble clipping scaled up to 225% of
// its original size
const preambleDims = preamble . scale ( 2.25 )
// Add a blank page to the document
const page = pdfDoc . addPage ( )
// Draw the American flag image in the center top of the page
page . drawPage ( americanFlag , {
... americanFlagDims ,
x : page . getWidth ( ) / 2 - americanFlagDims . width / 2 ,
y : page . getHeight ( ) - americanFlagDims . height - 150 ,
} )
// Draw the preamble clipping in the center bottom of the page
page . drawPage ( preamble , {
... preambleDims ,
x : page . getWidth ( ) / 2 - preambleDims . width / 2 ,
y : page . getHeight ( ) / 2 - preambleDims . height / 2 - 50 ,
} )
// Serialize the PDFDocument to bytes (a Uint8Array)
const pdfBytes = await pdfDoc . save ( )
// For example, `pdfBytes` can be:
// • Written to a file in Node
// • Downloaded from the browser
// • Rendered in an <iframe>
pdf-lib
mengandalkan modul saudaranya untuk mendukung penyematan font khusus: @pdf-lib/fontkit
. Anda harus menambahkan modul @pdf-lib/fontkit
ke proyek Anda dan mendaftarkannya menggunakan pdfDoc.registerFontkit(...)
sebelum menyematkan font khusus.
Lihat di bawah untuk petunjuk instalasi terperinci tentang cara menginstal
@pdf-lib/fontkit
sebagai modul UMD atau NPM.
Contoh ini menghasilkan PDF ini (bila font ini digunakan untuk variabel fontBytes
).
Coba demo JSFiddle
import { PDFDocument , rgb } from 'pdf-lib'
import fontkit from '@pdf-lib/fontkit'
// This should be a Uint8Array or ArrayBuffer
// This data can be obtained in a number of different ways
// If you're running in a Node environment, you could use fs.readFile()
// In the browser, you could make a fetch() call and use res.arrayBuffer()
const fontBytes = ...
// Create a new PDFDocument
const pdfDoc = await PDFDocument . create ( )
// Register the `fontkit` instance
pdfDoc . registerFontkit ( fontkit )
// Embed our custom font in the document
const customFont = await pdfDoc . embedFont ( fontBytes )
// Add a blank page to the document
const page = pdfDoc . addPage ( )
// Create a string of text and measure its width and height in our custom font
const text = 'This is text in an embedded font!'
const textSize = 35
const textWidth = customFont . widthOfTextAtSize ( text , textSize )
const textHeight = customFont . heightAtSize ( textSize )
// Draw the string of text on the page
page . drawText ( text , {
x : 40 ,
y : 450 ,
size : textSize ,
font : customFont ,
color : rgb ( 0 , 0.53 , 0.71 ) ,
} )
// Draw a box around the string of text
page . drawRectangle ( {
x : 40 ,
y : 450 ,
width : textWidth ,
height : textHeight ,
borderColor : rgb ( 1 , 0 , 0 ) ,
borderWidth : 1.5 ,
} )
// Serialize the PDFDocument to bytes (a Uint8Array)
const pdfBytes = await pdfDoc . save ( )
// For example, `pdfBytes` can be:
// • Written to a file in Node
// • Downloaded from the browser
// • Rendered in an <iframe>
Contoh ini menghasilkan PDF ini (ketika gambar ini digunakan untuk variabel jpgAttachmentBytes
dan PDF ini digunakan untuk variabel pdfAttachmentBytes
).
Coba demo JSFiddle
import { PDFDocument } from 'pdf-lib'
// These should be Uint8Arrays or ArrayBuffers
// This data can be obtained in a number of different ways
// If your running in a Node environment, you could use fs.readFile()
// In the browser, you could make a fetch() call and use res.arrayBuffer()
const jpgAttachmentBytes = ...
const pdfAttachmentBytes = ...
// Create a new PDFDocument
const pdfDoc = await PDFDocument . create ( )
// Add the JPG attachment
await pdfDoc . attach ( jpgAttachmentBytes , 'cat_riding_unicorn.jpg' , {
mimeType : 'image/jpeg' ,
description : 'Cool cat riding a unicorn! ???️' ,
creationDate : new Date ( '2019/12/01' ) ,
modificationDate : new Date ( '2020/04/19' ) ,
} )
// Add the PDF attachment
await pdfDoc . attach ( pdfAttachmentBytes , 'us_constitution.pdf' , {
mimeType : 'application/pdf' ,
description : 'Constitution of the United States ???' ,
creationDate : new Date ( '1787/09/17' ) ,
modificationDate : new Date ( '1992/05/07' ) ,
} )
// Add a page with some text
const page = pdfDoc . addPage ( ) ;
page . drawText ( 'This PDF has two attachments' , { x : 135 , y : 415 } )
// Serialize the PDFDocument to bytes (a Uint8Array)
const pdfBytes = await pdfDoc . save ( )
// For example, `pdfBytes` can be:
// • Written to a file in Node
// • Downloaded from the browser
// • Rendered in an <iframe>
Contoh ini menghasilkan PDF ini .
Coba demo JSFiddle
import { PDFDocument , StandardFonts } from 'pdf-lib'
// Create a new PDFDocument
const pdfDoc = await PDFDocument . create ( )
// Embed the Times Roman font
const timesRomanFont = await pdfDoc . embedFont ( StandardFonts . TimesRoman )
// Add a page and draw some text on it
const page = pdfDoc . addPage ( [ 500 , 600 ] )
page . setFont ( timesRomanFont )
page . drawText ( 'The Life of an Egg' , { x : 60 , y : 500 , size : 50 } )
page . drawText ( 'An Epic Tale of Woe' , { x : 125 , y : 460 , size : 25 } )
// Set all available metadata fields on the PDFDocument. Note that these fields
// are visible in the "Document Properties" section of most PDF readers.
pdfDoc . setTitle ( '? The Life of an Egg ?' )
pdfDoc . setAuthor ( 'Humpty Dumpty' )
pdfDoc . setSubject ( ' An Epic Tale of Woe ' )
pdfDoc . setKeywords ( [ 'eggs' , 'wall' , 'fall' , 'king' , 'horses' , 'men' ] )
pdfDoc . setProducer ( 'PDF App 9000 ?' )
pdfDoc . setCreator ( 'pdf-lib (https://github.com/Hopding/pdf-lib)' )
pdfDoc . setCreationDate ( new Date ( '2018-06-24T01:58:37.228Z' ) )
pdfDoc . setModificationDate ( new Date ( '2019-12-21T07:00:11.000Z' ) )
// Serialize the PDFDocument to bytes (a Uint8Array)
const pdfBytes = await pdfDoc . save ( )
// For example, `pdfBytes` can be:
// • Written to a file in Node
// • Downloaded from the browser
// • Rendered in an <iframe>
Coba demo JSFiddle
import { PDFDocument } from 'pdf-lib'
// This should be a Uint8Array or ArrayBuffer
// This data can be obtained in a number of different ways
// If your running in a Node environment, you could use fs.readFile()
// In the browser, you could make a fetch() call and use res.arrayBuffer()
const existingPdfBytes = ...
// Load a PDFDocument without updating its existing metadata
const pdfDoc = await PDFDocument . load ( existingPdfBytes , {
updateMetadata : false
} )
// Print all available metadata fields
console . log ( 'Title:' , pdfDoc . getTitle ( ) )
console . log ( 'Author:' , pdfDoc . getAuthor ( ) )
console . log ( 'Subject:' , pdfDoc . getSubject ( ) )
console . log ( 'Creator:' , pdfDoc . getCreator ( ) )
console . log ( 'Keywords:' , pdfDoc . getKeywords ( ) )
console . log ( 'Producer:' , pdfDoc . getProducer ( ) )
console . log ( 'Creation Date:' , pdfDoc . getCreationDate ( ) )
console . log ( 'Modification Date:' , pdfDoc . getModificationDate ( ) )
Skrip ini menampilkan keluaran berikut ( ketika PDF ini digunakan untuk variabel existingPdfBytes
):
Title: Microsoft Word - Basic Curriculum Vitae example.doc
Author: Administrator
Subject: undefined
Creator: PScript5.dll Version 5.2
Keywords: undefined
Producer: Acrobat Distiller 8.1.0 (Windows)
Creation Date: 2010-07-29T14:26:00.000Z
Modification Date: 2010-07-29T14:26:00.000Z
import {
PDFDocument ,
StandardFonts ,
NonFullScreenPageMode ,
ReadingDirection ,
PrintScaling ,
Duplex ,
PDFName ,
} from 'pdf-lib'
// Create a new PDFDocument
const pdfDoc = await PDFDocument . create ( )
// Embed the Times Roman font
const timesRomanFont = await pdfDoc . embedFont ( StandardFonts . TimesRoman )
// Add a page and draw some text on it
const page = pdfDoc . addPage ( [ 500 , 600 ] )
page . setFont ( timesRomanFont )
page . drawText ( 'The Life of an Egg' , { x : 60 , y : 500 , size : 50 } )
page . drawText ( 'An Epic Tale of Woe' , { x : 125 , y : 460 , size : 25 } )
// Set all available viewer preferences on the PDFDocument:
const viewerPrefs = pdfDoc . catalog . getOrCreateViewerPreferences ( )
viewerPrefs . setHideToolbar ( true )
viewerPrefs . setHideMenubar ( true )
viewerPrefs . setHideWindowUI ( true )
viewerPrefs . setFitWindow ( true )
viewerPrefs . setCenterWindow ( true )
viewerPrefs . setDisplayDocTitle ( true )
// Set the PageMode (otherwise setting NonFullScreenPageMode has no meaning)
pdfDoc . catalog . set ( PDFName . of ( 'PageMode' ) , PDFName . of ( 'FullScreen' ) )
// Set what happens when fullScreen is closed
viewerPrefs . setNonFullScreenPageMode ( NonFullScreenPageMode . UseOutlines )
viewerPrefs . setReadingDirection ( ReadingDirection . L2R )
viewerPrefs . setPrintScaling ( PrintScaling . None )
viewerPrefs . setDuplex ( Duplex . DuplexFlipLongEdge )
viewerPrefs . setPickTrayByPDFSize ( true )
// We can set the default print range to only the first page
viewerPrefs . setPrintPageRange ( { start : 0 , end : 0 } )
// Or we can supply noncontiguous ranges (e.g. pages 1, 3, and 5-7)
viewerPrefs . setPrintPageRange ( [
{ start : 0 , end : 0 } ,
{ start : 2 , end : 2 } ,
{ start : 4 , end : 6 } ,
] )
viewerPrefs . setNumCopies ( 2 )
// Serialize the PDFDocument to bytes (a Uint8Array)
const pdfBytes = await pdfDoc . save ( )
// For example, `pdfBytes` can be:
// • Written to a file in Node
// • Downloaded from the browser
// • Rendered in an <iframe>
import { PDFDocument } from 'pdf-lib'
// This should be a Uint8Array or ArrayBuffer
// This data can be obtained in a number of different ways
// If your running in a Node environment, you could use fs.readFile()
// In the browser, you could make a fetch() call and use res.arrayBuffer()
const existingPdfBytes = ...
// Load a PDFDocument without updating its existing metadata
const pdfDoc = await PDFDocument . load ( existingPdfBytes )
const viewerPrefs = pdfDoc . catalog . getOrCreateViewerPreferences ( )
// Print all available viewer preference fields
console . log ( 'HideToolbar:' , viewerPrefs . getHideToolbar ( ) )
console . log ( 'HideMenubar:' , viewerPrefs . getHideMenubar ( ) )
console . log ( 'HideWindowUI:' , viewerPrefs . getHideWindowUI ( ) )
console . log ( 'FitWindow:' , viewerPrefs . getFitWindow ( ) )
console . log ( 'CenterWindow:' , viewerPrefs . getCenterWindow ( ) )
console . log ( 'DisplayDocTitle:' , viewerPrefs . getDisplayDocTitle ( ) )
console . log ( 'NonFullScreenPageMode:' , viewerPrefs . getNonFullScreenPageMode ( ) )
console . log ( 'ReadingDirection:' , viewerPrefs . getReadingDirection ( ) )
console . log ( 'PrintScaling:' , viewerPrefs . getPrintScaling ( ) )
console . log ( 'Duplex:' , viewerPrefs . getDuplex ( ) )
console . log ( 'PickTrayByPDFSize:' , viewerPrefs . getPickTrayByPDFSize ( ) )
console . log ( 'PrintPageRange:' , viewerPrefs . getPrintPageRange ( ) )
console . log ( 'NumCopies:' , viewerPrefs . getNumCopies ( ) )
Skrip ini menampilkan keluaran berikut ( ketika PDF ini digunakan untuk variabel existingPdfBytes
):
HideToolbar: true
HideMenubar: true
HideWindowUI: false
FitWindow: true
CenterWindow: true
DisplayDocTitle: true
NonFullScreenPageMode: UseNone
ReadingDirection: R2L
PrintScaling: None
Duplex: DuplexFlipLongEdge
PickTrayByPDFSize: true
PrintPageRange: [ { start: 1, end: 1 }, { start: 3, end: 4 } ]
NumCopies: 2
Contoh ini menghasilkan PDF ini .
Coba demo JSFiddle
import { PDFDocument , rgb } from 'pdf-lib'
// SVG path for a wavy line
const svgPath =
'M 0,20 L 100,160 Q 130,200 150,120 C 190,-40 200,200 300,150 L 400,90'
// Create a new PDFDocument
const pdfDoc = await PDFDocument . create ( )
// Add a blank page to the document
const page = pdfDoc . addPage ( )
page . moveTo ( 100 , page . getHeight ( ) - 5 )
// Draw the SVG path as a black line
page . moveDown ( 25 )
page . drawSvgPath ( svgPath )
// Draw the SVG path as a thick green line
page . moveDown ( 200 )
page . drawSvgPath ( svgPath , { borderColor : rgb ( 0 , 1 , 0 ) , borderWidth : 5 } )
// Draw the SVG path and fill it with red
page . moveDown ( 200 )
page . drawSvgPath ( svgPath , { color : rgb ( 1 , 0 , 0 ) } )
// Draw the SVG path at 50% of its original size
page . moveDown ( 200 )
page . drawSvgPath ( svgPath , { scale : 0.5 } )
// Serialize the PDFDocument to bytes (a Uint8Array)
const pdfBytes = await pdfDoc . save ( )
// For example, `pdfBytes` can be:
// • Written to a file in Node
// • Downloaded from the browser
// • Rendered in an <iframe>
pdf-lib
sepenuhnya mendukung runtime Deno baru yang menarik! Semua contoh penggunaan berfungsi di Deno. Satu-satunya hal yang perlu Anda lakukan adalah mengubah impor pdf-lib
dan @pdf-lib/fontkit
untuk menggunakan Skypack CDN, karena Deno mengharuskan semua modul direferensikan melalui URL.
Lihat juga Cara Membuat dan Memodifikasi File PDF di Deno Dengan pdf-lib
Di bawah ini adalah contoh pembuatan dokumen yang dimodifikasi untuk Deno:
import {
PDFDocument ,
StandardFonts ,
rgb ,
} from 'https://cdn.skypack.dev/pdf-lib@^1.11.1?dts' ;
const pdfDoc = await PDFDocument . create ( ) ;
const timesRomanFont = await pdfDoc . embedFont ( StandardFonts . TimesRoman ) ;
const page = pdfDoc . addPage ( ) ;
const { width , height } = page . getSize ( ) ;
const fontSize = 30 ;
page . drawText ( 'Creating PDFs in JavaScript is awesome!' , {
x : 50 ,
y : height - 4 * fontSize ,
size : fontSize ,
font : timesRomanFont ,
color : rgb ( 0 , 0.53 , 0.71 ) ,
} ) ;
const pdfBytes = await pdfDoc . save ( ) ;
await Deno . writeFile ( 'out.pdf' , pdfBytes ) ;
Jika Anda menyimpan skrip ini sebagai create-document.ts
, Anda dapat menjalankannya menggunakan Deno dengan perintah berikut:
deno run --allow-write create-document.ts
File out.pdf
yang dihasilkan akan terlihat seperti PDF ini.
Berikut ini contoh yang sedikit lebih rumit yang menunjukkan cara menyematkan font dan mengukur teks di Deno:
import {
degrees ,
PDFDocument ,
rgb ,
StandardFonts ,
} from 'https://cdn.skypack.dev/pdf-lib@^1.11.1?dts' ;
import fontkit from 'https://cdn.skypack.dev/@pdf-lib/fontkit@^1.0.0?dts' ;
const url = 'https://pdf-lib.js.org/assets/ubuntu/Ubuntu-R.ttf' ;
const fontBytes = await fetch ( url ) . then ( ( res ) => res . arrayBuffer ( ) ) ;
const pdfDoc = await PDFDocument . create ( ) ;
pdfDoc . registerFontkit ( fontkit ) ;
const customFont = await pdfDoc . embedFont ( fontBytes ) ;
const page = pdfDoc . addPage ( ) ;
const text = 'This is text in an embedded font!' ;
const textSize = 35 ;
const textWidth = customFont . widthOfTextAtSize ( text , textSize ) ;
const textHeight = customFont . heightAtSize ( textSize ) ;
page . drawText ( text , {
x : 40 ,
y : 450 ,
size : textSize ,
font : customFont ,
color : rgb ( 0 , 0.53 , 0.71 ) ,
} ) ;
page . drawRectangle ( {
x : 40 ,
y : 450 ,
width : textWidth ,
height : textHeight ,
borderColor : rgb ( 1 , 0 , 0 ) ,
borderWidth : 1.5 ,
} ) ;
const pdfBytes = await pdfDoc . save ( ) ;
await Deno . writeFile ( 'out.pdf' , pdfBytes ) ;
Jika Anda menyimpan skrip ini sebagai custom-font.ts
, Anda dapat menjalankannya dengan perintah berikut:
deno run --allow-write --allow-net custom-font.ts
File out.pdf
yang dihasilkan akan terlihat seperti PDF ini.
Contoh penggunaan memberikan kode yang singkat dan langsung pada sasaran, menunjukkan berbagai fitur pdf-lib
. Anda dapat menemukan contoh kerja lengkap di direktori apps/
. Aplikasi ini digunakan untuk melakukan pengujian manual terhadap pdf-lib
sebelum setiap rilis (selain pengujian otomatis).
Saat ini ada empat aplikasi:
node
- berisi tes untuk pdf-lib
di lingkungan Node. Tes ini adalah referensi praktis ketika mencoba menyimpan/memuat PDF, font, atau gambar dengan pdf-lib
dari sistem file. Mereka juga memungkinkan Anda membuka PDF dengan cepat di berbagai penampil (Acrobat, Pratinjau, Foxit, Chrome, Firefox, dll...) untuk memastikan kompatibilitas.web
- berisi tes untuk pdf-lib
di lingkungan browser. Tes ini adalah referensi praktis ketika mencoba menyimpan/memuat PDF, font, atau gambar dengan pdf-lib
di lingkungan browser.rn
- berisi tes untuk pdf-lib
di lingkungan React Native. Tes ini adalah referensi praktis ketika mencoba menyimpan/memuat PDF, font, atau gambar dengan pdf-lib
di lingkungan React Native.deno
- berisi tes untuk pdf-lib
di lingkungan Deno. Tes ini adalah referensi praktis ketika mencoba menyimpan/memuat PDF, font, atau gambar dengan pdf-lib
dari sistem file. Untuk menginstal versi stabil terbaru:
# With npm
npm install --save pdf-lib
# With yarn
yarn add pdf-lib
Ini mengasumsikan Anda menggunakan npm atau benang sebagai manajer paket Anda.
Anda juga dapat mengunduh pdf-lib
sebagai modul UMD dari unpkg atau jsDelivr. Build UMD telah dikompilasi ke ES5, sehingga dapat berfungsi di browser modern apa pun. Pembuatan UMD berguna jika Anda tidak menggunakan manajer paket atau pemaket modul. Misalnya, Anda dapat menggunakannya langsung di tag <script>
pada halaman HTML.
Versi berikut tersedia:
CATATAN: jika Anda menggunakan skrip CDN dalam produksi, Anda harus menyertakan nomor versi tertentu di URL, misalnya:
- https://unpkg.com/[email protected]/dist/pdf-lib.min.js
- https://cdn.jsdelivr.net/npm/[email protected]/dist/pdf-lib.min.js
Saat menggunakan build UMD, Anda akan memiliki akses ke variabel window.PDFLib
global. Variabel ini berisi semua kelas dan fungsi yang diekspor oleh pdf-lib
. Misalnya:
// NPM module
import { PDFDocument , rgb } from 'pdf-lib' ;
// UMD module
var PDFDocument = PDFLib . PDFDocument ;
var rgb = PDFLib . rgb ;
pdf-lib
mengandalkan modul saudaranya untuk mendukung penyematan font khusus: @pdf-lib/fontkit
. Anda harus menambahkan modul @pdf-lib/fontkit
ke proyek Anda dan mendaftarkannya menggunakan pdfDoc.registerFontkit(...)
sebelum menyematkan font khusus (lihat contoh penyematan font). Modul ini tidak disertakan secara default karena tidak semua pengguna memerlukannya, dan ini meningkatkan ukuran bundel.
Memasang modul ini mudah. Sama seperti pdf-lib
itu sendiri, @pdf-lib/fontkit
dapat diinstal dengan npm
/ yarn
atau sebagai modul UMD.
# With npm
npm install --save @pdf-lib/fontkit
# With yarn
yarn add @pdf-lib/fontkit
Untuk mendaftarkan instance fontkit
:
import { PDFDocument } from 'pdf-lib'
import fontkit from '@pdf-lib/fontkit'
const pdfDoc = await PDFDocument . create ( )
pdfDoc . registerFontkit ( fontkit )
Versi berikut tersedia:
CATATAN: jika Anda menggunakan skrip CDN dalam produksi, Anda harus menyertakan nomor versi tertentu di URL, misalnya:
- https://unpkg.com/@pdf-lib/[email protected]/dist/fontkit.umd.min.js
- https://cdn.jsdelivr.net/npm/@pdf-lib/[email protected]/dist/fontkit.umd.min.js
Saat menggunakan build UMD, Anda akan memiliki akses ke variabel window.fontkit
global. Untuk mendaftarkan instance fontkit
:
var pdfDoc = await PDFLib . PDFDocument . create ( )
pdfDoc . registerFontkit ( fontkit )
Dokumentasi API tersedia di situs proyek di https://pdf-lib.js.org/docs/api/.
Repo untuk situs proyek (dan file dokumentasi yang dihasilkan) terletak di sini: https://github.com/Hopding/pdf-lib-docs.
Saat bekerja dengan PDF, Anda akan sering menemukan istilah "pengkodean karakter" dan "font". Jika Anda memiliki pengalaman dalam pengembangan web, Anda mungkin bertanya-tanya mengapa hal ini begitu lazim. Bukankah itu hanya detail menjengkelkan yang tidak perlu Anda khawatirkan? Bukankah perpustakaan dan pembaca PDF seharusnya bisa menangani semua ini untuk Anda seperti yang bisa dilakukan browser web? Sayangnya, hal ini tidak terjadi. Sifat format file PDF membuatnya sangat sulit untuk menghindari pemikiran tentang pengkodean karakter dan font saat bekerja dengan PDF.
pdf-lib
melakukan yang terbaik untuk menyederhanakan berbagai hal untuk Anda. Tapi itu tidak bisa melakukan sihir. Ini berarti Anda harus menyadari hal-hal berikut:
import { PDFDocument , StandardFonts } from 'pdf-lib'
const pdfDoc = await PDFDocument . create ( )
const courierFont = await pdfDoc . embedFont ( StandardFonts . Courier )
const page = pdfDoc . addPage ( )
page . drawText ( 'Some boring latin text in the Courier font' , {
font : courierFont ,
} )
embedFont
. Saat Anda menyematkan font Anda sendiri, Anda dapat menggunakan karakter Unicode apa pun yang didukungnya. Kemampuan ini membebaskan Anda dari batasan yang dikenakan oleh font standar. Sebagian besar file PDF menggunakan font yang disematkan. Anda dapat menyematkan dan menggunakan font khusus seperti (lihat juga): import { PDFDocument } from 'pdf-lib'
import fontkit from '@pdf-lib/fontkit'
const url = 'https://pdf-lib.js.org/assets/ubuntu/Ubuntu-R.ttf'
const fontBytes = await fetch ( url ) . then ( ( res ) => res . arrayBuffer ( ) )
const pdfDoc = await PDFDocument . create ( )
pdfDoc . registerFontkit ( fontkit )
const ubuntuFont = await pdfDoc . embedFont ( fontBytes )
const page = pdfDoc . addPage ( )
page . drawText ( 'Some fancy Unicode text in the ŪЬȕǹƚü font' , {
font : ubuntuFont ,
} )
Perhatikan bahwa kesalahan pengkodean akan terjadi jika Anda mencoba menggunakan karakter dengan font yang tidak mendukungnya. Misalnya, Ω
tidak ada dalam rangkaian karakter WinAnsi. Jadi mencoba menggambarnya pada halaman dengan font Helvetica standar akan menimbulkan kesalahan berikut:
Error: WinAnsi cannot encode "Ω" (0x03a9)
at Encoding.encodeUnicodeCodePoint
Menyematkan font dalam dokumen PDF biasanya akan meningkatkan ukuran file. Anda dapat mengurangi jumlah peningkatan ukuran file dengan membuat subset font sehingga hanya karakter yang diperlukan yang tertanam. Anda dapat membuat subset font dengan mengatur opsi subset
ke true
. Misalnya:
const font = await pdfDoc . embedFont ( fontBytes , { subset : true } ) ;
Perhatikan bahwa subsetting tidak berfungsi untuk semua font. Lihat #207 (komentar) untuk rincian tambahan.
pdf-lib
dapat membuat, mengisi, dan membaca kolom formulir PDF. Jenis bidang berikut ini didukung:
Lihat contoh penggunaan pembuatan formulir dan pengisian formulir untuk contoh kode. Pengujian 1, 14, 15, 16, dan 17 dalam contoh lengkap berisi kode contoh yang berfungsi untuk pembuatan formulir dan pengisian di berbagai lingkungan JS yang berbeda.
PENTING: Font default yang digunakan untuk menampilkan teks di tombol, dropdown, daftar opsi, dan kolom teks adalah font Helvetica standar. Font ini hanya mendukung karakter dalam alfabet latin (lihat Font dan Unicode untuk detailnya). Artinya, jika salah satu jenis bidang ini dibuat atau dimodifikasi untuk memuat teks di luar alfabet latin (seperti yang sering terjadi), Anda perlu menyematkan dan menggunakan font khusus untuk memperbarui tampilan bidang. Jika tidak, kesalahan akan terjadi (kemungkinan besar saat Anda menyimpan PDFDocument
).
Anda dapat menggunakan font tertanam saat mengisi kolom formulir sebagai berikut:
import { PDFDocument } from 'pdf-lib' ;
import fontkit from '@pdf-lib/fontkit' ;
// Fetch the PDF with form fields
const formUrl = 'https://pdf-lib.js.org/assets/dod_character.pdf' ;
const formBytes = await fetch ( formUrl ) . then ( ( res ) => res . arrayBuffer ( ) ) ;
// Fetch the Ubuntu font
const fontUrl = 'https://pdf-lib.js.org/assets/ubuntu/Ubuntu-R.ttf' ;
const fontBytes = await fetch ( fontUrl ) . then ( ( res ) => res . arrayBuffer ( ) ) ;
// Load the PDF with form fields
const pdfDoc = await PDFDocument . load ( formBytes ) ;
// Embed the Ubuntu font
pdfDoc . registerFontkit ( fontkit ) ;
const ubuntuFont = await pdfDoc . embedFont ( fontBytes ) ;
// Get two text fields from the form
const form = pdfDoc . getForm ( ) ;
const nameField = form . getTextField ( 'CharacterName 2' ) ;
const ageField = form . getTextField ( 'Age' ) ;
// Fill the text fields with some fancy Unicode characters (outside
// the WinAnsi latin character set)
nameField . setText ( 'Ӎӑȑїõ' ) ;
ageField . setText ( '24 ŷȇȁŗš' ) ;
// **Key Step:** Update the field appearances with the Ubuntu font
form . updateFieldAppearances ( ubuntuFont ) ;
// Save the PDF with filled form fields
const pdfBytes = await pdfDoc . save ( ) ;
Bidang formulir yang ada dapat diakses dengan metode PDFForm
berikut :
PDFForm.getButton
PDFForm.getCheckBox
PDFForm.getDropdown
PDFForm.getOptionList
PDFForm.getRadioGroup
PDFForm.getTextField
Bidang formulir baru dapat dibuat dengan metode PDFForm
berikut:
PDFForm.createButton
PDFForm.createCheckBox
PDFForm.createDropdown
PDFForm.createOptionList
PDFForm.createRadioGroup
PDFForm.createTextField
Di bawah ini adalah beberapa metode yang paling umum digunakan untuk membaca dan mengisi subkelas PDFField
yang disebutkan di atas:
PDFCheckBox.check
PDFCheckBox.uncheck
PDFCheckBox.isChecked
PDFDropdown.select
PDFDropdown.clear
PDFDropdown.getSelected
PDFDropdown.getOptions
PDFDropdown.addOptions
PDFOptionList.select
PDFOptionList.clear
PDFOptionList.getSelected
PDFOptionList.getOptions
PDFOptionList.addOptions
PDFRadioGroup.select
PDFRadioGroup.clear
PDFRadioGroup.getSelected
PDFRadioGroup.getOptions
PDFRadioGroup.addOptionToPage
PDFTextField.setText
PDFTextField.getText
PDFTextField.setMaxLength
PDFTextField.getMaxLength
PDFTextField.removeMaxLength
pdf-lib
dapat mengekstrak konten bidang teks (lihat PDFTextField.getText
), namun tidak dapat mengekstrak teks biasa pada halaman di luar bidang formulir. Ini adalah fitur yang sulit untuk diterapkan, tetapi fitur ini berada dalam cakupan perpustakaan ini dan mungkin ditambahkan ke pdf-lib
di masa mendatang. Lihat #93, #137, #177, #329, dan #380.pdf-lib
dapat menghapus dan mengedit konten bidang teks (lihat PDFTextField.setText
), namun tidak menyediakan API untuk menghapus atau mengedit teks pada halaman di luar bidang formulir. Ini juga merupakan fitur yang sulit untuk diterapkan, tetapi berada dalam cakupan pdf-lib
dan mungkin ditambahkan di masa mendatang. Lihat #93, #137, #177, #329, dan #380.pdf-lib
tidak mendukung penggunaan HTML atau CSS saat menambahkan konten ke PDF. Demikian pula, pdf-lib
tidak dapat menyematkan konten HTML/CSS ke dalam PDF. Meskipun fitur tersebut mudah digunakan, namun akan sangat sulit untuk diterapkan dan jauh di luar cakupan perpustakaan ini. Jika kemampuan ini adalah sesuatu yang Anda perlukan, pertimbangkan untuk menggunakan Puppeteer. Diskusi adalah tempat terbaik untuk mengobrol dengan kami, mengajukan pertanyaan, dan mempelajari lebih lanjut tentang pdf-lib!
Lihat juga MAINTAINERSHIP.md#communication dan MAINTAINERSHIP.md#discord.
pdf-lib
saat ini tidak mendukung dokumen terenkripsi. Anda tidak boleh menggunakan pdf-lib
dengan dokumen terenkripsi. Namun, ini adalah fitur yang dapat ditambahkan ke pdf-lib
. Silakan buat masalah jika Anda merasa fitur ini berguna!
Ketika dokumen terenkripsi diteruskan ke PDFDocument.load(...)
, kesalahan akan terjadi:
import { PDFDocument , EncryptedPDFError } from 'pdf-lib'
const encryptedPdfBytes = ...
// Assignment fails. Throws an `EncryptedPDFError`.
const pdfDoc = PDFDocument . load ( encryptedPdfBytes )
Perilaku default ini biasanya sesuai dengan keinginan Anda. Ini memungkinkan Anda mendeteksi dengan mudah apakah dokumen tertentu dienkripsi, dan mencegah Anda mencoba memodifikasinya. Namun, jika Anda benar-benar ingin memuat dokumen, Anda dapat menggunakan opsi { ignoreEncryption: true }
:
import { PDFDocument } from 'pdf-lib'
const encryptedPdfBytes = ...
// Assignment succeeds. Does not throw an error.
const pdfDoc = PDFDocument . load ( encryptedPdfBytes , { ignoreEncryption : true } )
Perhatikan bahwa menggunakan opsi ini tidak mendekripsi dokumen . Artinya, modifikasi apa pun yang Anda coba lakukan pada PDFDocument
yang dikembalikan mungkin gagal, atau memberikan hasil yang tidak diharapkan.
Anda sebaiknya tidak menggunakan opsi ini. Itu hanya ada karena alasan kompatibilitas ke belakang.
Kami menyambut kontribusi dari komunitas open source! Jika Anda tertarik untuk berkontribusi di pdf-lib
, silakan lihat file CONTRIBUTING.md. Ini berisi informasi untuk membantu Anda menyiapkan dan menjalankan pdf-lib
di mesin Anda. (Kami mencoba membuat ini sesederhana dan secepat mungkin!)
Kunjungi MAINTAINERSHIP.md untuk detail tentang bagaimana repo ini dikelola dan bagaimana kami menggunakan isu, PR, dan diskusi.
pdfkit
adalah perpustakaan pembuatan PDF untuk Node dan Browser. Library ini sangat membantu sebagai referensi dan bukti keberadaan saat membuat pdf-lib
. Kode pdfkit
untuk penyematan font, penyematan PNG, dan penyematan JPG sangat berguna.pdf.js
adalah perpustakaan rendering PDF untuk Browser. Pustaka ini berguna sebagai referensi saat menulis parser pdf-lib
. Beberapa kode untuk decoding aliran di-porting langsung ke TypeScript untuk digunakan di pdf-lib
.pdfbox
adalah perpustakaan pembuatan dan modifikasi PDF yang ditulis dalam Java. Pustaka ini adalah referensi yang sangat berharga saat mengimplementasikan pembuatan formulir dan pengisian API untuk pdf-lib
.jspdf
adalah perpustakaan pembuatan PDF untuk browser.pdfmake
adalah perpustakaan pembuatan PDF untuk browser.hummus
adalah perpustakaan pembuatan dan modifikasi PDF untuk lingkungan Node. hummus
adalah pembungkus Node di sekitar pustaka C++, sehingga tidak berfungsi di banyak lingkungan JavaScript - seperti Browser atau React Native.react-native-pdf-lib
adalah perpustakaan pembuatan dan modifikasi PDF untuk lingkungan React Native. react-native-pdf-lib
adalah pembungkus perpustakaan C++ dan Java.pdfassembler
adalah perpustakaan pembuatan dan modifikasi PDF untuk Node dan browser. Dibutuhkan beberapa pengetahuan tentang struktur logis dokumen PDF untuk digunakan. Repo ini dulunya berisi file bernama pdf_specification.pdf
di direktori root. Ini adalah salinan spesifikasi PDF 1.7, yang tersedia secara gratis oleh Adobe. Pada 30/8/2021, kami menerima keluhan DMCA yang mengharuskan kami menghapus file dari repo ini. Menghapus file melalui komit baru ke master
saja tidak cukup untuk memenuhi keluhan. File tersebut harus dihapus sepenuhnya dari riwayat git repo. Sayangnya, file tersebut ditambahkan lebih dari dua tahun yang lalu, ini berarti kami harus menulis ulang riwayat git repo dan memaksa push ke master
?.
Kami menghapus file tersebut dan menulis ulang riwayat repo menggunakan BFG Repo-Cleaner seperti yang dijelaskan di sini. Untuk transparansi penuh, berikut adalah perintah yang kami jalankan:
$ git clone [email protected]:Hopding/pdf-lib.git
$ cd pdf-lib
$ rm pdf_specification.pdf
$ git commit -am 'Remove pdf_specification.pdf'
$ bfg --delete-files pdf_specification.pdf
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
$ git push --force
Jika Anda pengguna pdf-lib
, Anda tidak perlu peduli! Terus gunakan pdf-lib
seperti biasa? !
Jika Anda adalah pengembang pdf-lib
(artinya Anda telah melakukan fork pdf-lib
dan/atau memiliki PR terbuka) maka hal ini akan berdampak pada Anda. Jika Anda melakukan fork atau mengkloning repo sebelum 30/8/2021 maka riwayat git fork Anda tidak sinkron dengan cabang master
repo ini. Sayangnya, hal ini mungkin akan membuat Anda pusing untuk menghadapinya. Maaf! Kami tidak ingin menulis ulang sejarah, tapi sebenarnya tidak ada alternatif lain.
Penting untuk dicatat bahwa kode sumber pdf-lib tidak berubah sama sekali. Ini persis sama seperti sebelum penulisan ulang riwayat git. Repo masih memiliki jumlah komit yang sama persis (dan bahkan konten komit yang sama, kecuali komit yang menambahkan pdf_specification.pdf
). Yang berubah adalah SHA dari komitmen tersebut.
Cara paling sederhana untuk menghadapi fakta ini adalah dengan:
Lihat jawaban StackOverflow ini untuk penjelasan yang bagus dan mendalam tentang apa yang diperlukan dalam penulisan ulang riwayat git.
MIT