Как скачать защищенный pdf файл с гугл диска?

Дурим Шала, обновил код по скачиванию защищенного файла с гугл диска.
Код работает на сентябрь 2023 года, добавлена проверка политики безопасности, которая выводила ошибку

Файл скачивается в виде картинок упакованных в ПДФ.

Руководство по загрузке защищенного PDF-файла с Google Диска

  1. Откройте документ в Документах Google.
  2. Прокрутите документ до конца, чтобы были видны все страницы.
  3. Откройте «Инструменты разработчика» для этого на клавиатуре нажмите Ctrl+Shift+C
  4. Выберите вкладку «Консоль».
  5. Вставьте код и нажмите Enter.
  6. ПДФ скачается в виде картинок упакованных в ПДФ.
let trustedURL;
if (window.trustedTypes && trustedTypes.createPolicy) {
    const policy = trustedTypes.createPolicy('myPolicy', {
        createScriptURL: (input) => {
            return input;
        }
    });
    trustedURL = policy.createScriptURL('https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js');
} else {
    trustedURL = 'https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js';
}

// Load the jsPDF library using the trusted URL.
let jspdf = document.createElement("script");
jspdf.onload = function () {
    // Generate a PDF from images with "blob:" sources.
    let pdf = new jsPDF();
    let elements = document.getElementsByTagName("img");
    for (let i = 0; i < elements.length; i++) {
        let img = elements[i];
        if (!/^blob:/.test(img.src)) {
            continue;
        }
        let canvasElement = document.createElement('canvas');
        let con = canvasElement.getContext("2d");
        canvasElement.width = img.width;
        canvasElement.height = img.height;
        con.drawImage(img, 0, 0, img.width, img.height);
        let imgData = canvasElement.toDataURL("image/jpeg", 1.0);
        pdf.addImage(imgData, 'JPEG', 0, 0);
        if (i !== elements.length - 1) {
            pdf.addPage();
        }
    }

    // Download the generated PDF.
    pdf.save("download.pdf");
};
jspdf.src = trustedURL;
document.body.appendChild(jspdf);

Если хотите до загрузки изменить имя download.pdf на свое. Измените имя в строке

pdf.save("download.pdf");

В измененном коде происходит проверка наличия поддержки Trusted Types в браузере.

Trusted Types — механизм безопасности веб-приложений.

В некоторых браузерах стоит запрет на вставку из буфера обмена в консоль, для активации вставки, наберите в консоли — allow pasting и нажмите энтер
  • Присутствует поддержка Trusted Types, создается политика Trusted Types под названием «myPolicy» определяющая как создавать безопасные URL. Затем создается доверенный URL для загрузки скрипта jspdf.min.js.
  • Отсутствует поддержка Trusted Types, используется стандартный URL для загрузки скрипта.

Вариант скрипта с фиксированным A4 в портретной ориентации (Portrait)

let trustedURL;
if (window.trustedTypes && trustedTypes.createPolicy) {
    const policy = trustedTypes.createPolicy('myPolicy', {
        createScriptURL: (input) => input
    });
    trustedURL = policy.createScriptURL('https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js');
} else {
    trustedURL = 'https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js';
}

let jspdf = document.createElement("script");
jspdf.onload = function () {
    // PDF фиксированного размера A4
    let pdf = new jsPDF('p', 'mm', 'a4');

    let elements = document.getElementsByTagName("img");

    for (let i = 0; i < elements.length; i++) {
        let img = elements[i];
        if (!/^blob:/.test(img.src)) continue;

        // Рисуем изображение в canvas
        let canvasElement = document.createElement('canvas');
        let con = canvasElement.getContext("2d");
        canvasElement.width = img.naturalWidth;
        canvasElement.height = img.naturalHeight;
        con.drawImage(img, 0, 0);

        // Получение JPEG из canvas
        let imgData = canvasElement.toDataURL("image/jpeg", 1.0);

        // Вставляем картинку на лист A4 по всей странице
        pdf.addImage(imgData, 'JPEG', 0, 0, 210, 297);

        if (i !== elements.length - 1) {
            pdf.addPage();
        }
    }

    pdf.save("download.pdf");
};

jspdf.src = trustedURL;
document.body.appendChild(jspdf);

Вариант скрипта с фиксированным A4 в альбомной ориентации (Landscape)

let trustedURL;
if (window.trustedTypes && trustedTypes.createPolicy) {
    const policy = trustedTypes.createPolicy('myPolicy', {
        createScriptURL: (input) => input
    });
    trustedURL = policy.createScriptURL('https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js');
} else {
    trustedURL = 'https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js';
}

let jspdf = document.createElement("script");
jspdf.onload = function () {

    // PDF A4 landscape: 297mm × 210mm
    let pdf = new jsPDF('l', 'mm', 'a4');

    let elements = document.getElementsByTagName("img");

    for (let i = 0; i < elements.length; i++) {
        let img = elements[i];
        if (!/^blob:/.test(img.src)) continue;

        // Создаем canvas по натуральным размерам изображения
        let canvasElement = document.createElement('canvas');
        let con = canvasElement.getContext("2d");
        canvasElement.width = img.naturalWidth;
        canvasElement.height = img.naturalHeight;
        con.drawImage(img, 0, 0);

        // Конвертируем в JPEG
        let imgData = canvasElement.toDataURL("image/jpeg", 1.0);

        // Вставляем изображение на всю страницу A4 landscape
        pdf.addImage(imgData, 'JPEG', 0, 0, 297, 210);

        if (i !== elements.length - 1) {
            pdf.addPage();
        }
    }

    pdf.save("download.pdf");
};

jspdf.src = trustedURL;
document.body.appendChild(jspdf);

Пакетное скачивание защищенных пдф файлов

gdrive_pdf_saver — проект на гитхабе, нужен питон.

Отправить
Поделиться
Твитнуть
Запинить

Поднимаю виртуальные сервера, настраиваю Windows, делаю резервное копирование, автоматизирую работу, консультирую по настройке сети


Обратиться с задачей
2 комментария
Cuileen 2024

Огромное спасибо, помогло ❤❤❤
Только у меня в файле альбомная ориентация (горизонтальная). С помощью вашего кода получился пдф, где книжная ориентация (вертикальная). Следовательно так получилось, что сама картинка а5 на листе а4 (вдвое уменьшено). ?
Я совсем не разбираюсь в кодах... Может тут есть строчка, которая влияет на итоговую ориентацию файла? Не подскажите? ?

Антон 2024

Этот способ подходит для простых PDF-файлов. Однако если вы хотите скачать PDF-документ с ссылками, то этот метод не сработает!