2012-05-04 19 views
10

Estoy interesado en usar PDFBox para un proyecto que requiere poder especificar colores planos y separaciones de color en salida PDF para ir a una impresora profesional y tengo curiosidad por saber si es compatible o no con esto. Si es así (y creo que sí), también estoy buscando algún código de ejemplo.¿PDFBox admite colores planos y separaciones?

Encontré una publicación anterior de 2009 en su lista de correo (here) que me lleva a creer que PDFBox puede admitir separaciones de color, pero no ha logrado encontrar ningún código de ejemplo. Miré a través de su JavaDoc y descubrí las clases org.apache.pdfbox.pdmodel.graphics.color, pero no tengo idea de cómo aprovecharlas y no veo ningún cookbook ejemplos en su sitio web o en su código fuente.

Agradecería especialmente cualquier ejemplo que ayude a ilustrar el espacio de color DeviceN.

+0

Separación y DeviceN no es lo mismo. –

Respuesta

0

Por qué no puedes usar PDSeparationclass

+0

Parece que es un paso en la dirección correcta. ¿Tiene algún código de muestra para aplicar esta clase a PDF? –

1

Por favor, vea la siguiente

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 si tiene alguna idea más inteligente, por favor hágamelo saber :)

+1

Tu respuesta ayudaría más al OP si le explicaras el código. – Markus

+0

Esta línea 'PDSeparation cs = (PDSeparation) color.getColorSpace();' es arriesgada porque no puede estar seguro de que todos los colores son separación. Además de eso, creo que la respuesta está bien; la alternativa sería crear el espacio de color desde cero, lo cual es difícil porque se debe crear la función tintTransform. –

Cuestiones relacionadas