2014-04-16 28 views
6

Apache Pdfbox'a ek yazı tipi stili eklemenin bir yolu var mı?Apache Pdfbox'a yazı tipi ekleniyor mu?

Şu anda sistemimizde PDF'leri baskı etrafında çalışmaya çalışıyoruz

(şu anda PDF-Renderer ile yapılıyor.) Çeşitli alternatifler bakarak edilmiştir (pdfbox, jpedal, jPDFPrint)

Umudumuz ücretsiz GPL içindir Kullanılacak uyumlu kütüphane ve pdfbox'a doğru eğiliyoruz. 'Çalışır' olan pdf'yi yazdırmak için örnek bir kod yazabildim. Aşağıya bakın:

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

Ben de belirtildiği gibi, bu işleri ama içine çalıştırıyorum sorun PdfBox pdf kullanılan yazı tiplerini takdirlerimizi görünmüyor ve bu tür değişiklikler gibi yazı kullanılıyor olmasıdır. Sonuç olarak, belge çok garip görünüyor (boşluk ve karakter boyutu farklı ve tuhaf görünüyor). Ben rutin böyle aşağıdaki günlük mesaj veya şeyleri görmek:

16 Nisan 2014 14:56:21 org.apache.pdfbox.pdmodel.font.PDSimpleFont ipli UYARI: < dan < üzerinde font> Değiştirme NimbusMono> varsayılan yazı tipine

Pdfbox'a yeni bir yazı tipi eklemeye nasıl yaklaşacağınız konusunda bir yol (veya referans) bilen var mı? Ya da bunu engelleyen, varsayılan yazı tipi nasıl değiştirilir?

Pdfbox, 14 standard fonts numaralı telefonu destekler. Ne yazık ki, NimbusMono bunlardan biri değil. Herhangi bir rehberlik takdir edilecektir.

cevap

7

Yayınlanmamış 2.0 sürümü gömülü fontların oluşturulmasını destekler. Bir anlık görüntü olarak https://repository.apache.org/content/groups/snapshots/org/apache/pdfbox/ veya "svn checkout http://svn.apache.org/repos/asf/pdfbox/trunk/" aracılığıyla edinebilirsiniz. API, 1.8.x sürümlerinden biraz farklıdır ve değişebilir, en iyisi kod örneklerine bakmaktır. Dosyanızın düzgün bir şekilde işlenip işlenmeyeceğini görmek için hızlı bir sınama "pdfbox-app" https://repository.apache.org/content/groups/snapshots/org/apache/pdfbox/pdfbox-app/2.0.0-SNAPSHOT/ 'u karşıdan yükleyip görüntüleyiciyi çalıştırmaktır: java -jar pdfbox-app-2.0.0-20140416.173452-273.jar PDFReader sizin file-name.pdf Ayrıca bir yazdırma özelliği var.

İyi şanslar!

Güncelleme 2016: 2.0 sürümü çıktı, here indir. 1.8 sürümünü kullandıysanız, migration guide'u okuyun.

+1

Teşekkürler! Dürüstçe 2.0.0 şubesini duymuştum ama buradaki bağlantıyı yayınlayana kadar bir nedenden dolayı bulamadım. 1.8.x versiyonları benim için çalışmıyorken, 2.0.0 şubesi ihtiyacım olanı veriyor. –

+0

Benim için de çalıştım :) teşekkürler –

1

PDFBox ile benzer bir sorunla karşılaştım. Java'nın javax.print paketi kullanılarak PDF'ler basit bir şekilde basılabilir. Aşağıdaki kod javax.print için API belgelerinden biraz değiştirilmiştir.

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 
    } 

Bu kod yazıcı doğrudan bir PDF kabul edebilir varsayar ancak bu PDFBox 1.8 şubenin sakat yazı sorunlarını atlamasına izin verir.

1

Aynı sorunu çözmeye çalışırken bu yazıya rastladım. PDFBox 2.0 API belgeleri şu anda mükemmel değil.

Aradığınız şey, Fontbox'taki FontFileFinder dosyasıdır. Fontbox içeren tam pdfbox-app kavanozunu kullandığınızdan emin olun.

Sadece bunu Windows üzerinde denedim, ancak diğer ana işletim sistemlerini desteklediği sanılan sınıflara bakmak.

Standart olmayan bir yazı tipi kullanarak, PDF'nin sol alt köşesinde küçük bir metin yazan bir yazı yazdım.

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(); 
    } 
}