Java 将网页转换为PDF或图像

Java 将网页转换为PDF或图像,java,image,pdf,png,Java,Image,Pdf,Png,我需要将网页[没有公共访问]转换为PDF或图像[最好转换为PNG] 网页包含一组图表和图像。大多数图表都是通过Ajax调用填充的,因此页面加载和图表加载之间存在延迟 我正在寻找以下问题的答案: 1-我找到了一组快照api,但它们都不支持访问我的内部页面。因为我试图导出的网页不是公共的,所以我需要进行身份验证。最大的问题是我不能将请求头[如会话id、cookie或其他变量]与这些API一起发送。他们似乎不支持这种功能 2-我不确定我是否能做到以下几点:使用HTTP客户端登录我的网页,添加HTTP头

我需要将网页[没有公共访问]转换为PDF或图像[最好转换为PNG]

网页包含一组图表和图像。大多数图表都是通过Ajax调用填充的,因此页面加载和图表加载之间存在延迟

我正在寻找以下问题的答案:

1-我找到了一组快照api,但它们都不支持访问我的内部页面。因为我试图导出的网页不是公共的,所以我需要进行身份验证。最大的问题是我不能将请求头[如会话id、cookie或其他变量]与这些API一起发送。他们似乎不支持这种功能

2-我不确定我是否能做到以下几点:使用HTTP客户端登录我的网页,添加HTTP头,发送get调用和获取HTML字符串。然后使用其中一个转换器将其转换为PDF。我不确定的是,是否有可能从我从http客户端获得的HTML字符串中获得正确的PDF,因为资源[css、js等]将丢失。我希望我的pdf/图像与网站上的完全一样

如果你能帮忙,我真的很感激

提前感谢,


ED

您可能最适合使用wkhtmltopdf,这是一个服务器端工具,安装起来很容易

有两个参数可用于等待Ajax完成,请尝试:

  • javascript延迟
    影响程序等待javascript完成的时间
  • 窗口状态
    等待窗口的特定返回代码
请参阅本程序的详细手册


wkhtmltopdf生成PDF,wkhtmltoimg生成图像,默认为PNG(根据您的要求)。

您可能最适合使用wkhtmltopdf,它是一种服务器端工具,易于安装

有两个参数可用于等待Ajax完成,请尝试:

  • javascript延迟
    影响程序等待javascript完成的时间
  • 窗口状态
    等待窗口的特定返回代码
请参阅本程序的详细手册


wkhtmltopdf生成PDF,wkhtmltoimg生成图像,默认为PNG(根据您的要求)。

身份验证很困难,因为它涉及安全性。因为您描述的操作是不寻常的,所以可能会导致各种各样的警铃响起。这是完全有可能做到的,但在面对安全更新和代码更改时,这是令人担忧的、容易出错的和脆弱的

因此,我将建议一种替代方法,这是我们经常为ABCpdf推荐的一种方法(我正在研究)。是的,我们支持标准的身份验证方法,但这种方法的优点在于它是健壮的,并且适用于其他解决方案(例如基于Java的)和新的身份验证方法

通常,您只需要当前页面的PDF文件。最简单的方法是对HTML进行snaffle。你这样做的方式取决于你的环境。例如,在ASP.NET下,可以使用HttpResponse.Filter属性或重写页面的呈现方法来获取当前页面的HTML。你这样做的方式将取决于你用什么编码

然后,您需要将此HTML保存到一个文件中,并通过“file://”协议URL将其呈现给您的解决方案。现在很明显,在这一点上,任何相对链接都会被破坏,但这很容易通过插入一个引用它们所在位置的基本标记来修复

通常,服务器端页面引用的资源类型是静态的。因此,如果您可以创建一个引用实际文件而不是网站的标记,那么您将绕过任何身份验证来访问这些资源

这仍然留下了基于AJAX的问题,这是另一个可能的蠕虫。渲染延迟方法是我们多年来一直支持的(在AJAX出现之前),但是它不是非常可靠,因为您不知道等待多长时间


更好的方法是通过回调更紧密地链接到JavaScript,您可以使用回调来确定页面是否已加载。我认为ABCpdf不适合您,因为它是.NET,但我肯定会鼓励您寻找使用这种更复杂方法的基于Java的解决方案。

身份验证很困难,因为它涉及安全性。因为您描述的操作是不寻常的,所以可能会导致各种各样的警铃响起。这是完全有可能做到的,但在面对安全更新和代码更改时,这是令人担忧的、容易出错的和脆弱的

因此,我将建议一种替代方法,这是我们经常为ABCpdf推荐的一种方法(我正在研究)。是的,我们支持标准的身份验证方法,但这种方法的优点在于它是健壮的,并且适用于其他解决方案(例如基于Java的)和新的身份验证方法

通常,您只需要当前页面的PDF文件。最简单的方法是对HTML进行snaffle。你这样做的方式取决于你的环境。例如,在ASP.NET下,可以使用HttpResponse.Filter属性或重写页面的呈现方法来获取当前页面的HTML。你这样做的方式将取决于你用什么编码

然后,您需要将此HTML保存到一个文件中,并通过“file://”协议URL将其呈现给您的解决方案。现在很明显,在这一点上,任何相对链接都会被破坏,但这很容易通过插入一个引用它们所在位置的基本标记来修复

通常,服务器端页面引用的资源类型是静态的。因此,如果您可以创建一个引用实际文件而不是网站的标记,那么您将绕过任何身份验证来访问这些资源

这仍然留下了基于AJAX的问题,这是另一个可能的蠕虫。渲染延迟方法是我们多年来一直支持的