我正在使用此示例 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();
})();
它确实保存了文档,但内容已损坏。
示例,这是文档在剧作家控制的浏览器上的样子。
但是这是本地保存的
不知道这里发生了什么。 我尝试了屏幕截图方法,它的行为方式确实相同。 我尝试触发
ctrl+s
,但了解到由于安全原因这是不可能的。我有点失落了。
如有任何帮助,我们将不胜感激。
但我的总体目标是从浏览器的pdf预览中下载pdf文件。
Chromium 有一个内置的 PDF 查看器扩展,在您导航到 PDF 文件后,它会向您显示嵌入了 PDF 的网页,以便您可以预览它。因此,您下载的是包含 PDF 的网页,而不是 PDF 本身。
我尝试在 Chrome 控制台中使用 jQuery 使用
$('#download').get(0).click()
,但看起来控制台无法检测到扩展程序注入的代码。它可能与 Playright 一起使用。
但是无论如何你应该使用 fetch() 来下载文件本身。如果您正在进行自动化端到端测试,则无论如何都没有理由测试扩展的功能。
使用 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();
}