2017-03-28 1 views
0

J'utilise PDFBox pour créer des fichiers PDF et j'insère une image «d'arrière-plan» sur le PDF, qui est essentiellement une bordure incurvée et des informations sur les réseaux sociaux.PDFBox crée un fichier PDF affiché différemment dans chaque navigateur

S'il vous plaît trouverez ci-dessous le code i utiliser pour générer le 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(); 

Lorsque l'image est ouvert, il chrome, il semble être mal placée:

Image on chrome

The second image is how it appears in google chrome

Je semble également avoir des problèmes d'insertion d'images avec des couleurs au format PDF et ils apparaissent également bizarre lors de la conversion du PDF t o une image

+1

Veuillez partager le pdf en question pour l'analyse. – mkl

Répondre

1

Le navigateur affiche un rendu PDF approximatif jusqu'à un certain point, ce qui signifie que presque aucun navigateur n'implémente de manière exhaustive les spécifications PDF.

Ceci s'applique à presque tous les moteurs de rendu PDF, le plus fidèle est naturellement le lecteur Adobe PDF, qui est pratiquement l'implémentation de référence.

Dans le passé, le navigateur utilisait des plugins tiers pour intégrer le PDF, mais cela posait des problèmes de sécurité, au point que maintenant ils le font eux-mêmes. Vous ne pouvez donc pas compter sur un seul navigateur pour être sûr que votre PDF s'affichera correctement à chaque fois, c'est un processus d'essai et d'erreur (cela vaut également pour d'autres logiciels implémentant le rendu PDF, comme les imprimantes compatibles PDF).

La seule solution raisonnable est de:

  1. Essayez d'abord sur Acrobat (il est au moins la référence)
  2. Vérifiez avec les navigateurs et si elles ne respectent pas essayer d'obtenir le même résultat avec différentes techniques.

PDF c'est une spécification très complexe et il y a beaucoup de façons différentes d'obtenir des résultats, essayez le plus simple.