PDFBox 创建在每个浏览器中显示不同的 PDF
PDFBox creates PDF that is displayed differently in each browser
我正在使用 PDFBox 创建 PDF,我在 PDF 上插入了一个 "background" 图片,它基本上是一个弯曲的边框和一些社交网络信息。
请在下面找到我用来生成 PDF 的代码:
PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);
PDPageContentStream contentStream = new PDPageContentStream(document, page);
PDImageXObject pdImage = PDImageXObject.createFromFile(basePath+"images/"+ticket.getId()+".png", document);
PDImageXObject backgroundImage = PDImageXObject.createFromFile(basePath+"images/ticket_template.jpg",document);
backgroundImage.setWidth(595);
backgroundImage.setHeight(800);
contentStream.drawImage(backgroundImage,10,0);
contentStream.drawImage(pdImage,(page.getMediaBox().getWidth() - pdImage.getWidth()) / 2,page.getMediaBox().getHeight()-400);
float margin = 50;
// starting y position is whole page height subtracted by top and bottom margin
float yStartNewPage = page.getMediaBox().getHeight() - (2 * margin);
// we want table across whole page width (subtracted by left and right margin ofcourse)
float tableWidth = page.getMediaBox().getWidth() - (2 * margin);
boolean drawContent = true;
float yStart = yStartNewPage;
float bottomMargin = 70;
// y position is your coordinate of top left corner of the table
float yPosition = 550;
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm");
BaseTable table = new BaseTable(400, yStartNewPage, bottomMargin, tableWidth, margin, document, page, true, drawContent);
generateTable(table,"Event",event.getName());
generateTable(table,"Código",ticket.getId());
generateTable(table,"Data Ínicio",dateFormat.format(event.getStartDate()));
generateTable(table,"Data Fim",dateFormat.format(event.getEndDate()));
generateTable(table,"Mesa",eventTable.getName());
generateTable(table,"Número de Convidados",ticket.getNumberOfPeople()+"");
table.draw();
contentStream.close();
document.save(new File(basePath+"docs/"+ticket.getId()+".pdf"));
document.close();
图片打开后chrome好像放错地方了:
我在将带颜色的图像插入 PDF 时似乎也有问题,而且在将 PDF 转换为图像时它们也显得很奇怪
浏览器在一定程度上近似 PDF 渲染,这意味着几乎没有浏览器实现详尽的 PDF 规范。
几乎所有的PDF渲染引擎都适用,最真实的自然是Adobe PDFreader,几乎就是参考实现
以前浏览器使用第三方插件嵌入PDF,但是这带来了安全问题,以至于现在他们自己做。
因此,您不能完全依赖单一浏览器来确保您的 PDF 每次都能正确显示,这是一个反复试验的过程(对于其他实现 PDF 渲染的软件,如支持 PDF 的打印机,也是如此)。
唯一明智的解决方案是:
- 先在Acrobat上试试(至少是参考)
- 用浏览器检查它,如果它们不符合,尝试用不同的技术获得相同的结果。
PDF 这是一个非常复杂的规范,有很多不同的方法可以得到一些结果,请尝试最简单的方法。
我正在使用 PDFBox 创建 PDF,我在 PDF 上插入了一个 "background" 图片,它基本上是一个弯曲的边框和一些社交网络信息。
请在下面找到我用来生成 PDF 的代码:
PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);
PDPageContentStream contentStream = new PDPageContentStream(document, page);
PDImageXObject pdImage = PDImageXObject.createFromFile(basePath+"images/"+ticket.getId()+".png", document);
PDImageXObject backgroundImage = PDImageXObject.createFromFile(basePath+"images/ticket_template.jpg",document);
backgroundImage.setWidth(595);
backgroundImage.setHeight(800);
contentStream.drawImage(backgroundImage,10,0);
contentStream.drawImage(pdImage,(page.getMediaBox().getWidth() - pdImage.getWidth()) / 2,page.getMediaBox().getHeight()-400);
float margin = 50;
// starting y position is whole page height subtracted by top and bottom margin
float yStartNewPage = page.getMediaBox().getHeight() - (2 * margin);
// we want table across whole page width (subtracted by left and right margin ofcourse)
float tableWidth = page.getMediaBox().getWidth() - (2 * margin);
boolean drawContent = true;
float yStart = yStartNewPage;
float bottomMargin = 70;
// y position is your coordinate of top left corner of the table
float yPosition = 550;
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm");
BaseTable table = new BaseTable(400, yStartNewPage, bottomMargin, tableWidth, margin, document, page, true, drawContent);
generateTable(table,"Event",event.getName());
generateTable(table,"Código",ticket.getId());
generateTable(table,"Data Ínicio",dateFormat.format(event.getStartDate()));
generateTable(table,"Data Fim",dateFormat.format(event.getEndDate()));
generateTable(table,"Mesa",eventTable.getName());
generateTable(table,"Número de Convidados",ticket.getNumberOfPeople()+"");
table.draw();
contentStream.close();
document.save(new File(basePath+"docs/"+ticket.getId()+".pdf"));
document.close();
图片打开后chrome好像放错地方了:
我在将带颜色的图像插入 PDF 时似乎也有问题,而且在将 PDF 转换为图像时它们也显得很奇怪
浏览器在一定程度上近似 PDF 渲染,这意味着几乎没有浏览器实现详尽的 PDF 规范。
几乎所有的PDF渲染引擎都适用,最真实的自然是Adobe PDFreader,几乎就是参考实现
以前浏览器使用第三方插件嵌入PDF,但是这带来了安全问题,以至于现在他们自己做。
因此,您不能完全依赖单一浏览器来确保您的 PDF 每次都能正确显示,这是一个反复试验的过程(对于其他实现 PDF 渲染的软件,如支持 PDF 的打印机,也是如此)。
唯一明智的解决方案是:
- 先在Acrobat上试试(至少是参考)
- 用浏览器检查它,如果它们不符合,尝试用不同的技术获得相同的结果。
PDF 这是一个非常复杂的规范,有很多不同的方法可以得到一些结果,请尝试最简单的方法。