You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Selenium Java读取Chrome Viewer中PDF渲染的aspx文档内容

解决Selenium Java获取动态PDF内容的方案

针对你遇到的动态URL页面、embed标签src为空但能下载PDF的场景,提供两种实用的Selenium Java实现方案:

方法一:拦截网络请求获取PDF原始内容

因为页面的PDF是通过后续网络请求加载的,我们可以利用Chrome DevTools监听网络响应,直接捕获返回PDF的请求并提取内容:

import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.v120.network.Network;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Optional;

public class PdfNetworkExtractor {
    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver", "你的chromedriver路径");
        ChromeDriver driver = new ChromeDriver();
        DevTools devTools = driver.getDevTools();
        devTools.createSession();

        // 启用网络监听
        devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));

        // 监听响应,筛选PDF类型的请求
        devTools.addListener(Network.responseReceived(), response -> {
            String mimeType = response.getResponse().getMimeType();
            if ("application/pdf".equals(mimeType)) {
                String requestId = response.getRequestId();
                // 获取响应体字节流
                Network.GetResponseBodyResponse bodyResp = devTools.send(Network.getResponseBody(requestId));
                byte[] pdfBytes = bodyResp.getBody().getBytes();
                
                // 保存PDF到本地(也可直接处理字节内容)
                try (FileOutputStream fos = new FileOutputStream("captured.pdf")) {
                    fos.write(pdfBytes);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

        // 执行点击按钮操作,触发新标签页打开
        driver.findElement(By.id("你的按钮ID")).click();

        // 等待请求完成(建议替换为WebDriverWait显式等待,更稳定)
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        driver.quit();
    }
}

方法二:调用Chrome打印API导出PDF

利用Chrome自带的打印功能,直接将Viewer页面导出为PDF,无需关心动态URL:

import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.v120.page.Page;
import java.io.FileOutputStream;
import java.util.Base64;
import java.util.Optional;
import java.util.concurrent.TimeUnit;

public class PdfPrintExtractor {
    public static void main(String[] args) {
        ChromeOptions options = new ChromeOptions();
        // 可选:无头模式运行,避免弹出浏览器窗口
        options.addArguments("--headless=new");
        options.addArguments("--disable-gpu");
        
        System.setProperty("webdriver.chrome.driver", "你的chromedriver路径");
        ChromeDriver driver = new ChromeDriver(options);
        DevTools devTools = driver.getDevTools();
        devTools.createSession();

        // 点击按钮打开新标签页
        driver.findElement(By.id("你的按钮ID")).click();

        // 切换到新打开的标签页
        driver.switchTo().window(driver.getWindowHandles().stream().skip(1).findFirst().get());

        // 等待页面加载完成
        driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);

        // 调用打印API生成PDF(参数可按需调整)
        Page.PrintToPDFResponse pdfResp = devTools.send(Page.printToPDF(
                Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(),
                Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(),
                Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(),
                Optional.of(true), Optional.empty(), Optional.empty(), Optional.empty(),
                Optional.empty(), Optional.empty()
        ));

        // 解码Base64内容并保存
        byte[] pdfBytes = Base64.getDecoder().decode(pdfResp.getData());
        try (FileOutputStream fos = new FileOutputStream("printed.pdf")) {
            fos.write(pdfBytes);
        } catch (Exception e) {
            e.printStackTrace();
        }

        driver.quit();
    }
}

注意事项

  • 确保ChromeDriver版本与本地Chrome浏览器版本完全匹配,否则DevTools功能会失效
  • 建议将Thread.sleep替换为WebDriverWait显式等待,根据页面元素或网络状态判断加载完成时机
  • 两种方法都会自动继承当前会话的登录Cookie,无需额外处理权限问题

内容的提问来源于stack exchange,提问作者Bhavya S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 18:00:10