2012-05-04 21 views
10

Tôi quan tâm đến việc sử dụng PDFBox cho một dự án yêu cầu có thể chỉ định màu sắc tại chỗ và tách màu trong đầu ra PDF để đi tới máy in chuyên nghiệp và tò mò về việc có hỗ trợ điều này hay không. Nếu có (và tôi nghĩ vậy), tôi cũng đang tìm một số mã ví dụ.Liệu PDFBox có hỗ trợ màu sắc và phân tách tại chỗ không?

Tôi tìm thấy một bài đăng cũ từ năm 2009 trong danh sách gửi thư của họ (here) dẫn tôi tin rằng PDFBox có thể hỗ trợ tách màu, nhưng chưa thành công trong việc tìm kiếm bất kỳ mã ví dụ nào. Tôi đã xem qua JavaDoc và phát hiện các lớp học org.apache.pdfbox.pdmodel.graphics.color, nhưng không có bất kỳ ý tưởng nào về cách tận dụng chúng và không thấy bất kỳ ví dụ cookbook nào trên trang web của chúng hoặc trong mã nguồn của chúng.

Tôi đặc biệt đánh giá cao bất kỳ ví dụ nào giúp minh họa không gian màu DeviceN.

+0

Tính năng phân tách và thiết bịN không giống nhau. –

Trả lời

0

Tại sao bạn không thể sử dụng PDSeparationclass

+0

Điều này có vẻ như đó là một bước đi đúng hướng. Bạn có bất kỳ mã mẫu nào để áp dụng lớp này cho đầu ra PDF không? –

1

Xin xem như sau

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 nếu bạn có một số ý tưởng nhiều hơn thông minh hơn, xin vui lòng cho tôi biết :)

+1

Câu trả lời của bạn sẽ giúp OP nhiều hơn nếu bạn giải thích mã cho anh ta. – Markus

+0

Dòng này 'PDSeparation cs = (PDSeparation) color.getColorSpace();' là nguy hiểm bởi vì bạn không thể biết chắc chắn rằng tất cả các màu là tách. Bên cạnh đó, tôi nghĩ câu trả lời là OK; sự thay thế sẽ là tạo ra không gian màu từ đầu, điều này khó bởi vì hàm tintTransform phải được tạo ra. –