2012-05-04 15 views
10

Sono interessato all'utilizzo di PDFBox per un progetto che richiede la possibilità di specificare le tinte piatte e le separazioni dei colori nell'output PDF per andare a una stampante professionale e sono curioso di sapere se supporta o meno questo. Se è così (e penso di sì), sto anche cercando un codice di esempio.PDFBox supporta colori spot e separazioni?

Ho trovato un vecchio post dal 2009 nella loro mailing list (here) che mi porta a credere che PDFBox possa supportare le separazioni di colore, ma non sono riuscito a trovare alcun codice di esempio. Ho guardato attraverso il loroe ho scoperto le classi org.apache.pdfbox.pdmodel.graphics.color, ma non ho idea di come sfruttarle e non vedo alcun esempio cookbook sul loro sito web o nel loro codice sorgente.

Apprezzo in particolare qualsiasi esempio che aiuti a illustrare lo spazio dei colori DeviceN.

+0

Seperation e DeviceN non sono la stessa cosa. –

risposta

0

Perché non si può utilizzare PDSeparationclass

+0

Sembra che sia un passo nella giusta direzione. Avete qualche codice di esempio per applicare questa classe all'output PDF? –

1

Si prega di vedere come qui di seguito

enter image description here

1. get the PDColor from a PDF file(spotColor.pdf),and make sure that the spot colors which you well used are in this PDF file.(I made the file by Adobe Illustrator) 
    public static Map<String, PDColor> getSpotColor() { 
      Map<String, PDColor> colors = new HashMap<String, PDColor>(); 
      PDDocument spotColorFile = null; 
      try { 
       spotColorFile = PDDocument.load(new FileInputStream(new File(
         "d:\\spotColor.pdf"))); 
       for (PDPage page : spotColorFile.getPages()) { 
        for (COSName name : page.getResources().getColorSpaceNames()) { 
         PDColor color = page.getResources().getColorSpace(name) 
           .getInitialColor(); 
         PDSeparation cs = (PDSeparation) color.getColorSpace(); 
         colors.put(cs.getColorantName(), color); 
        } 
       } 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } finally { 
       if (spotColorFile != null) 
        try { 
         spotColorFile.close(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } finally { 
         spotColorFile = null; 
        } 
      } 
      return colors; 
     } 
2. use your PDColor 
public static void main(String[] args) { 
     PDDocument doc = null; 
     PDPage page = null; 
     try { 
      Map<String, PDColor> colors = getSpotColor(); 
      doc = new PDDocument(); 
      page = new PDPage(new PDRectangle(100, 100)); 
      doc.addPage(page); 
      PDPageContentStream content = new PDPageContentStream(doc, page); 

      content.beginText(); 
      content.setNonStrokingColor(colors.get("PANTONE 2607 C")); 
      content.setFont(PDType1Font.HELVETICA_BOLD, 20); 
      content.showText("abcdef"); 
      content.endText(); 

      content.setNonStrokingColor(colors.get("PANTONE 108 U")); 
      content.addRect(50, 50, 50, 50); 
      content.fill(); 
      content.close(); 

      doc.save("d:\\spotColorTest.pdf"); 
     } catch (Exception e) { 
      System.out.println(e); 
     } finally { 
      if (doc != null) 
       try { 
        doc.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } finally { 
        doc = null; 
       } 
     } 
    } 

3 se avete qualche idea più intelligente, per favore fatemelo sapere :)

+1

La tua risposta aiuterebbe l'OP di più se gli avessi spiegato il codice. – Markus

+0

Questa riga 'PDSeparation cs = (PDSeparation) color.getColorSpace();' è rischiosa perché non si può sapere con certezza che tutti i colori siano separati. Oltre a ciò, penso che la risposta sia OK; l'alternativa sarebbe creare lo spazio dei colori da zero che è difficile perché deve essere creata la funzione tintTransform. –