
Peringatan Penting: Gunakan script ini dengan bijak dan hanya untuk file yang memang Anda miliki izin aksesnya. Script ini bekerja dengan prinsip "screenshot" halaman demi halaman, bukan membuka proteksi file.
Pernahkah Anda mendapatkan file PDF dari Google Drive dalam mode View Only (hanya bisa dilihat) dan sangat membutuhkan salinannya untuk keperluan offline? Secara default, Google Drive memang bisa mencegah pengunduhan file PDF. Namun, ada satu trik teknis yang bisa digunakan: Browser Script.
Script yang akan kita bahas ini bekerja dengan mengambil screenshot setiap halaman PDF yang terbuka di preview Google Drive, lalu menggabungkannya kembali menjadi satu file PDF baru. Hasilnya kualitas gambarnya cukup baik karena mengambil dari kanvas asli halaman.
Persiapan Sebelum Memulai
- Buka file PDF di Google Drive.
- Klik tombol Preview.
- Di pojok kanan atas, klik menu tiga titik vertikal → pilih "Open in new window" (Buka di jendela baru). Ini penting agar script bisa mengakses konten dengan benar.
- Scroll halaman PDF hingga ke bagian paling bawah. Pastikan semua halaman sudah termuat seluruhnya.
Panduan Langkah demi Langkah
1. Buka Console Browser
- Chrome/Edge (Windows):
F12atauCtrl+Shift+I - Chrome/Edge (Mac):
Cmd+Option+I - Firefox (Windows):
F12 - Firefox (Mac):
Cmd+Option+I
Lalu klik tab Console.
2. Aktifkan "allow pasting" (Khusus Chrome)
Jika Anda menggunakan Chrome dan tidak bisa menempelkan kode di console, ketikkan teks berikut lalu tekan Enter:
allow pasting
3. Copy dan Jalankan Script
Copy kode JavaScript di bawah ini, paste di console browser, lalu tekan Enter:
(function () {
console.log("Loading script ...");
let script = document.createElement("script");
script.onload = function () {
const { jsPDF } = window.jspdf;
// Generate a PDF from images with "blob:" sources.
let pdf = null;
let imgElements = document.getElementsByTagName("img");
let validImgs = [];
console.log("Scanning content ...");
for (let i = 0; i < imgElements.length; i++) {
let img = imgElements[i];
// specific check for Google Drive blob images
let checkURLString = "blob:https://drive.google.com/";
if (img.src.substring(0, checkURLString.length) !== checkURLString) {
continue;
}
validImgs.push(img);
}
console.log(`${validImgs.length} content found!`);
console.log("Generating PDF file ...");
for (let i = 0; i < validImgs.length; i++) {
let img = validImgs[i];
// Convert image to DataURL via Canvas
let canvasElement = document.createElement("canvas");
let con = canvasElement.getContext("2d");
canvasElement.width = img.naturalWidth;
canvasElement.height = img.naturalHeight;
con.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight);
let imgData = canvasElement.toDataURL();
// Determine orientation and dimensions for THIS specific image
let orientation = img.naturalWidth > img.naturalHeight ? "l" : "p";
let pageWidth = img.naturalWidth;
let pageHeight = img.naturalHeight;
if (i === 0) {
// Initialize PDF with the dimensions of the FIRST image
pdf = new jsPDF({
orientation: orientation,
unit: "px",
format: [pageWidth, pageHeight],
});
} else {
// For subsequent images, add a new page with THAT image's specific dimensions
pdf.addPage([pageWidth, pageHeight], orientation);
}
// Add the image to the current page
pdf.addImage(imgData, "PNG", 0, 0, pageWidth, pageHeight, "", "SLOW");
const percentages = Math.floor(((i + 1) / validImgs.length) * 100);
console.log(`Processing content ${percentages}%`);
}
// Check if title contains .pdf in end of the title
let title = document.querySelector('meta[itemprop="name"]')?.content || document.title || 'download.pdf';
if ((title.split(".").pop() || "").toLowerCase() !== "pdf") {
title = title + ".pdf";
}
// Download the generated PDF.
console.log("Downloading PDF file ...");
pdf.save(title, { returnPromise: true }).then(() => {
document.body.removeChild(script);
console.log("PDF downloaded!");
});
};
// Load the jsPDF library using the trusted URL.
let scriptURL = "https://unpkg.com/jspdf@latest/dist/jspdf.umd.min.js";
let trustedURL;
if (window.trustedTypes && trustedTypes.createPolicy) {
const policy = trustedTypes.createPolicy("myPolicy", {
createScriptURL: (input) => {
return input;
},
});
trustedURL = policy.createScriptURL(scriptURL);
} else {
trustedURL = scriptURL;
}
script.src = trustedURL;
document.body.appendChild(script);
})();
Proses dan Hasil
- Tunggu hingga proses selesai. Kecepatan proses tergantung pada:
- Jumlah halaman PDF
- Ukuran dan kompleksitas tiap halaman
- File PDF akan otomatis terunduh dengan nama sesuai judul asli file (atau
download.pdfjika tidak terdeteksi)
Keterbatasan dan Catatan Penting
1. Bukan "Crack" Proteksi - Script ini tidak membuka password atau menghapus pembatasan izin. Ia seperti "memotret" layar secara otomatis.
2. Kualitas - Hasilnya adalah PDF berbasis gambar (scan), bukan teks yang bisa di-copy.
3. Jumlah Halaman - Untuk PDF dengan ratusan halaman, proses bisa sangat berat dan memakan memori browser.
4. Jika Gagal - Pastikan Anda sudah scroll hingga akhir halaman (poin 4 di persiapan). Jika tidak, halaman yang belum termuat tidak akan terekam.
Output Console yang Diharapkan
Loading script ...
Scanning content ...
15 content found!
Generating PDF file ...
Processing content 6%
Processing content 13%
Processing content 20%
...
Processing content 100%
Downloading PDF file ...
PDF downloaded!
Sumber Referensi
Script ini merupakan hasil karya zavierferodova yang dipublikasikan di github.
Tips Tambahan
Tips: Untuk file PDF yang sangat besar, sebaiknya lakukan proses ini di komputer dengan RAM yang cukup (minimal 8GB) dan gunakan browser Chrome/Edge yang berbasis Chromium untuk performa terbaik.
Gunakan sesuai kebutuhan dan hormati hak cipta pemilik file.