2012-05-04 11 views
10

Jestem zainteresowany wykorzystaniem PDFBox do projektu, który wymaga możliwości określenia kolorów dodatkowych i separacji kolorów w pliku PDF, aby przejść do profesjonalnej drukarki i jestem ciekaw, czy to obsługuje. Jeśli tak (i ​​tak myślę), szukam również przykładowego kodu.Czy PDFBox obsługuje kolory dodatkowe i separacje?

Znalazłem stary wpis z 2009 roku na ich liście mailingowej (here), który prowadzi mnie do przekonania, że ​​PDFBox może obsługiwać separację kolorów, ale nie udało się znaleźć żadnego przykładowego kodu. Przejrzałem ich JavaDoc i odkryłem klasy org.apache.pdfbox.pdmodel.graphics.color, ale nie mam pojęcia, jak je wykorzystać i nie widzę żadnych przykładów na ich stronie internetowej lub w ich kodzie źródłowym.

Szczególnie doceniam wszelkie przykłady ilustrujące przestrzeń kolorów DeviceN.

+0

Seperacja i urządzenieN nie są takie same. –

Odpowiedz

0

Dlaczego nie można użyć PDSeparationclass

+0

Wydaje się, że jest to krok we właściwym kierunku. Czy masz przykładowy kod do zastosowania tej klasy do wyjścia PDF? –

1

proszę zobaczyć poniżej

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, jeśli masz jakiś pomysł bardziej inteligentne, proszę dać mi znać :)

+1

Twoja odpowiedź pomoże OP bardziej, jeśli wytłumaczysz mu kod. – Markus

+0

Ta linia 'PDSeparation cs = (PDSeparation) color.getColorSpace();' jest ryzykowna, ponieważ nie możesz wiedzieć na pewno, że wszystkie kolory są separacją. Poza tym myślę, że odpowiedź jest w porządku; alternatywą byłoby stworzenie przestrzeni kolorów od zera, co jest trudne, ponieważ musi zostać utworzona funkcja tintTransform. –