PDFBox创建的PDF在每个浏览器中以不同方式显示

时间:2017-03-28 23:20:21

标签: java pdf pdfbox

我使用PDFBox创建PDF并插入"背景" PDF上的图像基本上是一个弯曲的边框和一些社交网络信息。

请在下面找到我用来生成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();

当图像被打开时,它似乎是错位的:

Image on chrome

The second image is how it appears in google chrome

我似乎也有问题在PDF中插入带有颜色的图像,在将PDF转换为图像时它们看起来也很奇怪

1 个答案:

答案 0 :(得分:1)

浏览器近似PDF渲染到一定程度,这意味着几乎没有浏览器实现详尽的PDF规范。

这几乎适用于所有PDF渲染引擎,最真实的当然是Adobe PDF阅读器,实际上是参考实现。

过去浏览器使用第三方插件来嵌入PDF,但这带来了安全问题,现在他们自己做了。

因此,您无法完全依赖单个浏览器来确保您的PDF每次都能正确显示,这是一个试错过程(对于其他实现PDF渲染的软件也是如此,例如支持PDF的打印机)

唯一合理的解决方案是:

  1. 首先在Acrobat上尝试(至少是参考)
  2. 使用浏览器进行检查,如果他们不遵守,请尝试使用不同的技术获得相同的结果。
  3. PDF它是一个非常复杂的规范,有很多不同的方法来获得一些结果,尝试最简单的。