问题描述:在使用Angular + Spring Boot + JasperSoft生成PDF文档时,无法加载PDF文档。
解决方法:
确保JasperSoft服务器正常运行,并且可以访问到生成的PDF文档。可以通过直接访问JasperSoft服务器上的URL来验证。
在Angular项目中,确保已正确配置JasperSoft服务器的URL。可以在Angular项目的环境配置文件中设置JasperSoft服务器的URL,例如在environment.ts
文件中添加如下配置:
export const environment = {
production: false,
jasperSoftUrl: 'http://localhost:8080/jasperserver'
};
在需要加载PDF文档的组件中,可以通过使用HttpClient
在Angular中访问JasperSoft服务器的URL。示例如下:
import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { environment } from 'src/environments/environment';
@Component({
selector: 'app-pdf-viewer',
templateUrl: './pdf-viewer.component.html',
styleUrls: ['./pdf-viewer.component.css']
})
export class PdfViewerComponent implements OnInit {
pdfUrl: string;
constructor(private http: HttpClient) { }
ngOnInit() {
this.loadPdf();
}
loadPdf() {
const reportPath = '/reports/myreport.pdf';
this.pdfUrl = `${environment.jasperSoftUrl}${reportPath}`;
// 通过HttpClient获取PDF文档
this.http.get(this.pdfUrl, { responseType: 'blob' })
.subscribe(response => {
this.createPdfObjectUrl(response);
});
}
createPdfObjectUrl(blob: Blob) {
const fileURL = URL.createObjectURL(blob);
const iframe = document.getElementById('pdf-iframe') as HTMLIFrameElement;
iframe.src = fileURL;
}
}
在上述代码中,pdfUrl
变量定义了PDF文档的URL,通过HttpClient
发送GET请求获取PDF文档的二进制数据,并使用createPdfObjectUrl
方法将二进制数据转换为可供元素加载的URL。
application.properties
文件中添加如下配置:jasperserver.url=http://localhost:8080/jasperserver
在生成PDF文档的Controller中,可以使用RestTemplate
发送GET请求获取PDF文档的二进制数据,并将其写入HttpServletResponse
返回给前端。示例如下:
@RestController
@RequestMapping("/pdf")
public class PdfController {
@Autowired
private RestTemplate restTemplate;
@Value("${jasperserver.url}")
private String jasperServerUrl;
@GetMapping("/download")
public void downloadPdf(HttpServletResponse response) throws IOException {
String reportUrl = jasperServerUrl + "/reports/myreport.pdf";
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_OCTET_STREAM));
HttpEntity entity = new HttpEntity<>(headers);
ResponseEntity responseEntity = restTemplate.exchange(reportUrl, HttpMethod.GET, entity, byte[].class);
byte[] pdfData = responseEntity.getBody();
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=myreport.pdf");
response.getOutputStream().write(pdfData);
response.flushBuffer();
}
}
在上述代码中,downloadPdf
方法使用RestTemplate
发送GET请求获取PDF文档的二进制数据,并将其写入HttpServletResponse
返回给前端。
通过以上的解决方法,可以解决“Angular + Spring Boot + JasperSoft: 无法加载PDF文档”的问题。