2014-04-16 13 views
6

C'è un modo per aggiungere altri stili di carattere in Apache Pdfbox?Aggiunta di caratteri ad Apache Pdfbox?

momento stiamo cercando di aggirare la stampa PDF nel nostro sistema (attualmente in fase di fatto con PDF-Renderer.) Ho cercato in varie alternative (pdfbox, jpedal, jPDFPrint)

La nostra speranza è per un GPL gratuito libreria compatibile da usare, e come tale ci stiamo orientando verso pdfbox. Sono stato in grado di scrivere un codice di esempio per stampare il pdf che "funziona". Vedi sotto:

PDDocument doc; 
try { 
     doc = PDDocument.load("test.pdf"); 
     doc.print(); 
    } catch (Exception e) { 
     // Come up with better thing to do on fail. 
     e.printStackTrace(); 
    } 

Come ho già detto, questo funziona ma il problema che sto funzionando in è che PDFBox non sembra essere il riconoscimento dei caratteri utilizzati nel PDF, e come tali cambiamenti il ​​tipo di carattere utilizzato. Di conseguenza il documento appare molto strano (la spaziatura e la dimensione del carattere sono diverse e sembrano bizzarre). Io abitualmente vedo il seguente messaggio di registro, o cose del genere è:

Apr 16, 2014 14:56:21 org.apache.pdfbox.pdmodel.font.PDSimpleFont drawString ATTENZIONE: La modifica dei caratteri su <> da < NimbusMono> al carattere predefinito

Qualcuno conosce un modo (o un riferimento) su come affrontare l'aggiunta di un nuovo fonttype in pdfbox? O a parte questo, come cambiare il tipo di carattere predefinito?

Da quello che posso dire, pdfbox supporta 14 standard fonts. Sfortunatamente NimbusMono non è uno di questi. Qualsiasi guida sarebbe apprezzata.

risposta

7

La versione 2.0 non rilasciata supporta il rendering di caratteri incorporati. Puoi ottenerlo come istantanea https://repository.apache.org/content/groups/snapshots/org/apache/pdfbox/ o tramite "svn checkout http://svn.apache.org/repos/asf/pdfbox/trunk/". L'API è leggermente diversa dalle versioni 1.8.x e potrebbe cambiare, il migliore è guardare gli esempi di codice. Un rapido test per vedere se il tuo file sarà renderizzato correttamente è quello di scaricare l'app "pdfbox" https://repository.apache.org/content/groups/snapshots/org/apache/pdfbox/pdfbox-app/2.0.0-SNAPSHOT/ e quindi eseguire il visualizzatore: java-jar pdfbox-app-2.0.0-20140416.173452-273.jar PDFReader tuo- nome-file.pdf C'è anche una funzione di stampa.

Buona fortuna!

Aggiornamento 2016: versione 2.0 è scaricata, scaricala here. Se si è utilizzata la versione 1.8, leggere migration guide.

+1

Grazie! Onestamente, avevo sentito parlare del ramo 2.0.0 ma non sono riuscito a trovarlo per qualche motivo finché non hai pubblicato il link qui. Mentre le versioni 1.8.x non funzionavano per me, il ramo 2.0.0 sembra avere quello di cui ho bisogno. –

+0

Ha funzionato anche per me :) grazie –

1

Ho riscontrato un problema simile con PDFBox. I PDF possono essere stampati in modo semplice usando il pacchetto javax.print di Java. Il seguente codice è leggermente modificato dai documenti API per javax.print.

DocFlavor flavor = DocFlavor.INPUT_STREAM.PDF; 
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); 
aset.add(MediaSizeName.ISO_C6); //letter size 
PrintService[] pservices = PrintServiceLookup.lookupPrintServices(flavor, aset); 
if (pservices.length > 0) { 
    DocPrintJob pj = pservices[0].createPrintJob(); 
    try { 
     FileInputStream fis = new FileInputStream("test.pdf"); 
     Doc doc = new SimpleDoc(fis, flavor, null); 
     pj.print(doc, aset); 
    } catch (FileNotFoundException | PrintException e) { 
     //do something 
    } 

Questo codice presuppone che la stampante può accettare direttamente un PDF ma permette di bypassare i problemi di carattere traballante PDFBox 1.8 del ramo.

1

Mi sono imbattuto in questo post mentre cercavo di risolvere lo stesso problema. La documentazione dell'API di PDFBox 2.0 non è eccezionale al momento.

Quello che stai cercando è FontFileFinder in Fontbox. Assicurati di utilizzare l'intero contenitore per le applicazioni PDFbox che include Fontbox.

L'ho provato solo su Windows ma guardando le classi sembra che supporti gli altri principali sistemi operativi.

Ecco un semplice esempio di classe che ho scritto che scrive un piccolo frammento di testo nell'angolo in basso a sinistra di un PDF, utilizzando un carattere non standard.

import java.io.File; 
import java.io.IOException; 
import java.net.URI; 
import java.util.List; 

import org.apache.fontbox.util.autodetect.FontFileFinder; 
import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.PDPage; 
import org.apache.pdfbox.pdmodel.PDPageContentStream; 
import org.apache.pdfbox.pdmodel.font.PDType0Font; 
import org.apache.pdfbox.pdmodel.font.PDType1Font; 

public class TestPDFWrite { 

    public static void main(String[] args) throws IOException { 

     FontFileFinder fontFinder = new FontFileFinder(); 
     List<URI> fontURIs = fontFinder.find(); 

     File fontFile = null; 

     for (URI uri : fontURIs) { 
      File font = new File(uri); 
      if (font.getName().equals("CHILLER.TTF")) { 
       fontFile = font; 
      } 
     } 

     PDDocument document = new PDDocument(); 
     PDPage page = new PDPage(); 
     document.addPage(page); 

     PDPageContentStream contentStream = new PDPageContentStream(document, page); 
     contentStream.beginText(); 

     if (fontFile != null) { 
      contentStream.setFont(PDType0Font.load(document, fontFile), 12); 
     } else { 
      contentStream.setFont(PDType1Font.HELVETICA, 12); 
     } 

     contentStream.newLineAtOffset(10, 10); 
     contentStream.showText("Hello World"); 
     contentStream.endText(); 
     contentStream.close(); 
     document.save("C:/Hello World.pdf"); 
     document.close(); 
    } 
} 
Problemi correlati