我有一个现有的界面,其中有一个用于显示pdf文件的JPanel。
在此界面中显示pdf并且不打开新窗口非常重要。 如果可能的话,如何在不使用不必要的代码(库)的情况下在JPanel上显示pdf?
答案 0 :(得分:14)
如果你想渲染PDF内容并忽略原始格式(粗体,字体大小等),你可以使用任何PDF解析器(PDFBox,Tika ..等)解析PDF,然后将字符串结果设置为任何文本组件(JTextFiled或JTextArea)。
否则你应该使用PDF渲染库。有一些商业图书馆。
但是我在上一个项目中使用了一个小技巧来在我自己的面板中显示PDF,如下所示:
这个想法是在您的应用程序中使用嵌入式Web组件,然后将文件路径传递给该组件,然后Web渲染组件将加载您机器中可用的相应PDF渲染工具,在我的情况下,该机器具有acrobat reader。 / p>
我使用这个库来自DJ项目的Native Swing: http://djproject.sourceforge.net/ns/
只需制作网络浏览器:
private JWebBrowser fileBrowser = new JWebBrowser();
并控制浏览器外观,然后将浏览器添加到主面板(其布局为BorderLayout)
fileBrowser.setBarsVisible(false);
fileBrowser.setStatusBarVisible(false);
fileRenderPanel.add(fileBrowser, BorderLayout.CENTER);
然后如果你要使用PDF:
fileBrowser.navigate(filePath);
如果您想突出显示PDF中的某些关键字:
fileBrowser.navigate(filePath + "#search= " + keyword + ""); // work on acrobat reader only
如果你想渲染其他文本(plain,html):
fileBrowser.setHTMLContent(htmlContent);
答案 1 :(得分:1)
您需要使用库来呈现它,就像jpedal或PDF-renderer或多价。
答案 2 :(得分:0)
我认为最好的选择是使用 ICEpdf 。
ICEpdf API是100%Java,轻量级,快速,高效且易于使用。
ICEpdf可以用作独立的开源Java PDF查看器,也可以轻松嵌入到任何Java应用程序中,以无缝加载或捕获PDF文档。除了PDF文档渲染之外,ICEpdf功能多样,可以多种创新方式使用。
在使用Maven管理的项目中,您可以包括:
<!-- https://mvnrepository.com/artifact/org.icepdf.os/icepdf-core -->
<dependency>
<groupId>org.icepdf.os</groupId>
<artifactId>icepdf-core</artifactId>
<version>${icepdf.version}</version>
<exclusions>
<exclusion>
<groupId>javax.media</groupId>
<artifactId>jai_core</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/org.icepdf.os/icepdf-viewer -->
<dependency>
<groupId>org.icepdf.os</groupId>
<artifactId>icepdf-viewer</artifactId>
<version>${icepdf.version}</version>
</dependency>
然后,您可以使用类似于以下内容的代码在面板中可视化pdf:
// Instance the controller
controller = new SwingController();
// We created the SwingViewFactory configured with the controller
SwingViewBuilder factory = new SwingViewBuilder(controller);
// We use the factory to build a preconfigured JPanel
// with a full and active viewer user interface.
viewerComponentPanel = factory.buildViewerPanel();
viewerComponentPanel.setPreferredSize(new Dimension(400, 243));
viewerComponentPanel.setMaximumSize(new Dimension(400, 243));
// We add keyboard command
ComponentKeyBinding.install(controller, viewerComponentPanel);
// add interactive mouse link annotation support via callback
controller.getDocumentViewController().setAnnotationCallback(
new org.icepdf.ri.common.MyAnnotationCallback(
controller.getDocumentViewController()));
// We add the component to visualize the report
reportViewerContainer.add(viewerComponentPanel, BorderLayout.CENTER);
reportViewerContainer.invalidate();
// We open the generated document
controller.openDocument(reportLocationUri.toURL());
结果你可以获得如下内容:
希望这可以帮到你。
答案 3 :(得分:0)
如果您愿意使用 SWT 库,有一个非常简单的方法。您将声明一个 Swing 浏览器并将浏览器 URL 设置为文件路径。
shell = new Shell();
shell.setSize(800, 600);
shell.setText("PDF View");
Browser browser = new Browser(shell, SWT.NONE);
browser.setUrl("sample.pdf");
browser.setBounds(10, 10, 764, 541);
完整代码如下:
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class PdfViewPage {
protected Shell shell;
/**
* Launch the application.
* @param args
*/
public static void main(String[] args) {
try {
PdfViewPage window = new PdfViewPage();
window.open();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Open the window.
*/
public void open() {
Display display = Display.getDefault();
createContents();
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
/**
* Create contents of the window.
*/
protected void createContents() {
shell = new Shell();
shell.setSize(800, 600);
shell.setText("PDF View");
Browser browser = new Browser(shell, SWT.NONE);
browser.setUrl("sample.pdf");
browser.setBounds(10, 10, 764, 541);
}
}