如何从浏览器的pdf预览中保存/下载pdf文件?

问题描述 投票:0回答:2

我正在使用此示例 PDF。

https://www.cheat-sheets.org/saved-copy/http-response-codes-1.pdf

我的目标是将其下载为 pdf 文件。

这是我到目前为止的代码

const playwright = require('playwright');

(async () => {
  const browser = await playwright.chromium.launch();
  const context = await browser.newContext();
  const page = await context.newPage();

  // await page.emulateMedia({ media: 'print' }); // Doesn't work also.
  await page.emulateMedia({ media: 'screen' });

  await page.goto('https://www.cheat-sheets.org/saved-copy/http-response-codes-1.pdf');

  console.log('Page Visited');

  await page.waitForTimeout(3000); // To wait for the pdf to be full loaded.

  console.log('Timeout Done');

  await page.pdf({ path: `document.pdf` });

  console.log('Document Saved');

  await browser.close();
})();

它确实保存了文档,但内容已损坏。

示例,这是文档在剧作家控制的浏览器上的样子。

enter image description here

但是这是本地保存的

enter image description here

不知道这里发生了什么。 我尝试了屏幕截图方法,它的行为方式确实相同。 我尝试触发

ctrl+s
,但了解到由于安全原因这是不可能的。我有点失落了。

如有任何帮助,我们将不胜感激。

但我的总体目标是从浏览器的pdf预览中下载pdf文件。

javascript node.js playwright
2个回答
0
投票

Chromium 有一个内置的 PDF 查看器扩展,在您导航到 PDF 文件后,它会向您显示嵌入了 PDF 的网页,以便您可以预览它。因此,您下载的是包含 PDF 的网页,而不是 PDF 本身。

我尝试在 Chrome 控制台中使用 jQuery 使用

$('#download').get(0).click()
,但看起来控制台无法检测到扩展程序注入的代码。它可能与 Playright 一起使用。

但是无论如何你应该使用 fetch() 来下载文件本身。如果您正在进行自动化端到端测试,则无论如何都没有理由测试扩展的功能。


-1
投票

使用 fetch()

JAVA 示例代码

 // take url
 String pdfUrl = ((PageImpl) page).mainFrame().url();
    try {

        // Download the contents of the PDF file
        List<Integer> pdfContentAsIntList = (List<Integer>) page.evaluate("async (url) => {" +
                "  const response = await fetch(url);" +
                "  if (!response.ok) {" +
                "    throw new Error(`HTTP error! status: ${response.status}`);" +
                "  }" +
                "  const arrayBuffer = await response.arrayBuffer();" +
                "  return Array.from(new Uint8Array(arrayBuffer));" +
                "}", pdfUrl);

        // Convert the result to a byte array
        byte[] pdfContent = new byte[pdfContentAsIntList.size()];
        for (int i = 0; i < pdfContentAsIntList.size(); i++) {
            pdfContent[i] = pdfContentAsIntList.get(i).byteValue();
        }

        // Save the PDF file to disk
        Path outputPath = Path.of("file.pdf");
        Files.write(outputPath, pdfContent);

    } catch (Exception e) {
        e.printStackTrace();
    }
© www.soinside.com 2019 - 2024. All rights reserved.