2014-04-16 25 views
6

Czy istnieje sposób dodawania dodatkowych stylów czcionek do Apache Pdfbox?Dodawanie czcionek do Apache Pdfbox?

Jesteśmy obecnie próbuje obejść drukowania plików PDF w naszym systemie (obecnie odbywa się PDF-Renderer.) I zostały patrząc na różnych alternatyw (pdfbox, jpedal, jPDFPrint)

Nasza nadzieja jest dla wolnej licencji GPL kompatybilna biblioteka do użytku i jako taka pochylamy się w stronę pdfbox. Byłem w stanie napisać przykładowy kod, aby wydrukować plik pdf, który "działa". Patrz poniżej:

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

Jak już wspomniałem, to działa, ale problem biegnę na to, że PDFBox nie wydaje się być rozpoznawanie czcionek używanych w pliku PDF, jak i takich zmian używana czcionka. W rezultacie dokument wygląda bardzo dziwnie (odstępy i wielkość znaków są różne i wyglądają dziwacznie). I rutynowo zobaczyć następujący komunikat dziennika lub rzeczy podobnego:

16 kwietnia 2014 14:56:21 org.apache.pdfbox.pdmodel.font.PDSimpleFont sznurkiem UWAGA: Zmiana czcionki na <> z < NimbusMono> do domyślnej czcionki

Czy ktoś wie o sposobie (lub odwołaniu), w jaki sposób podejść do dodawania nowego typu czcionki do formatu PDF? A może nie, jak zmienić domyślny typ czcionki?

Z tego, co wiem, pdfbox obsługuje 14 standard fonts. Niestety NimbusMono nie jest jednym z nich. Wszelkie wskazówki będą mile widziane.

Odpowiedz

7

Niepublikowana wersja 2.0 obsługuje renderowanie osadzonych czcionek. Możesz go uzyskać jako migawkę https://repository.apache.org/content/groups/snapshots/org/apache/pdfbox/ lub przez "svn checkout http://svn.apache.org/repos/asf/pdfbox/trunk/". Interfejs API nieznacznie różni się od wersji 1.8.x i może się zmienić, najlepiej jest przyjrzeć się przykładom kodu. Szybki test, aby sprawdzić, czy plik zostanie poprawnie wygenerowany, to pobrać "pdfbox-app", a następnie uruchomić przeglądarkę: java -jar pdfbox-app-2.0.0-20140416.173452-273.jar PDFReader file-name.pdf Istnieje również funkcja drukowania.

Powodzenia!

Aktualizacja 2016: wydanie 2.0 zostało wydane, pobierz go here. Jeśli korzystasz z wersji 1.8, przeczytaj migration guide.

+1

Dzięki! Szczerze dowiedziałem się o gałęzi 2.0.0, ale nie mogłem jej znaleźć z jakiegoś powodu, dopóki nie opublikowałeś linku tutaj. Podczas gdy wersje 1.8.x nie działają dla mnie, gałąź 2.0.0 wydaje się mieć to, czego potrzebuję. –

+0

Pracowałem też dla mnie :) dzięki –

1

Wpadłem na podobny problem z PDFBox. Pliki PDF można drukować w prosty sposób przy użyciu pakietu javax.print Java. Poniższy kod został nieznacznie zmodyfikowany w dokumentacji interfejsu API dla pliku 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 
    } 

Kod ten zakłada, że ​​drukarka może przyjąć PDF bezpośrednio, ale pozwala na ominięcie problemów wonky czcionek PDFBox 1.8 oddziału.

1

Natrafiłem na ten post, próbując rozwiązać ten sam problem. Dokumentacja API PDFBox 2.0 nie jest w tej chwili świetna.

Czego szukasz, to FontFileFinder w Fontbox. Upewnij się, że używasz pełnego słoika aplikacji PDFbox, który zawiera Fontbox.

Próbowałem tylko tego w systemie Windows, ale patrząc na klasy wydaje się, że obsługuje on inne główne systemy operacyjne.

Oto prosta przykładowa klasa, którą napisałem, która wypisuje niewielki fragment tekstu w lewym dolnym rogu pliku PDF, używając niestandardowej czcionki.

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(); 
    } 
} 
Powiązane problemy