You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@pdfbox.apache.org by Floris <fn...@gmail.com> on 2015/03/25 22:52:09 UTC

PDDeviceN

Hey there,

I am struggeling getting the PDDeviceN color space to work. I am trying 
to create a simple page with one rectangle having a color defined 
against a DeviceN space. I tried the following:

PDDeviceN cs =newPDDeviceN();
cs.setAlternateColorSpace(PDDeviceCMYK.INSTANCE);
cs.setColorantNames(Arrays.asList("Cyan","Magenta","Yellow","Black","Orange","Green"));

PDFunction func;
COSArray domains =newCOSArray();
COSArray ranges =newCOSArray();

domains.setFloatArray(new float[]{0.0f,1.0f,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f});
ranges.setFloatArray(new float[]{0.0f,1.0f,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f});

COSDictionary dict=newCOSDictionary();
dict.setItem(COSName.FUNCTION_TYPE, COSInteger.get(4));
dict.setItem(COSName.DOMAIN, domains);
dict.setItem(COSName.RANGE, ranges);

try{
	func = PDFunction.create(tintdata);
         cs.setTintTransform(func);
}catch(IOException e) {
         e.printStackTrace();
}

This results in a NullPointerError in the first row of the try-part. The 
type4-function should just pop the first two values (to get from CMYKOG 
to CMYK). Could someone give me a jump start on how to define a 
PDDeviceN space?

Have a nice day,
Floris

Re: PDDeviceN

Posted by Floris <fn...@gmail.com>.
Nice! The app-1.8.10-20150327.210556-4 snapshot seems to work indeed. 
Thanks Tilman.

Have a nice day,
Floris

On 28-3-2015 07:07, Tilman Hausherr wrote:
> You can find a snapshot version for testing here:
> https://repository.apache.org/content/groups/snapshots/org/apache/pdfbox/pdfbox-app/1.8.10-SNAPSHOT/ 
>
> (use the one at the bottom. It includes pdfbox, fontbox and jempbox)
>
> The issue I created is
> https://issues.apache.org/jira/browse/PDFBOX-2734
>
> Please tell me if it works now.
>
> Tilman
>
>
> Am 27.03.2015 um 18:07 schrieb Tilman Hausherr:
>> Your code is correct. I found at three (!!!) bugs in our 1.8 code and 
>> I will create an issue in JIRA and come back to you. Be patient :-) 
>> Should a black rectangle appear?
>>
>> Do you have a more advanced postscript code so that one can see that 
>> "something happens" with the 5th and 6th color?
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
> For additional commands, e-mail: users-help@pdfbox.apache.org
>


Re: PDDeviceN

Posted by Tilman Hausherr <TH...@t-online.de>.
You can find a snapshot version for testing here:
https://repository.apache.org/content/groups/snapshots/org/apache/pdfbox/pdfbox-app/1.8.10-SNAPSHOT/
(use the one at the bottom. It includes pdfbox, fontbox and jempbox)

The issue I created is
https://issues.apache.org/jira/browse/PDFBOX-2734

Please tell me if it works now.

Tilman


Am 27.03.2015 um 18:07 schrieb Tilman Hausherr:
> Your code is correct. I found at three (!!!) bugs in our 1.8 code and 
> I will create an issue in JIRA and come back to you. Be patient :-) 
> Should a black rectangle appear?
>
> Do you have a more advanced postscript code so that one can see that 
> "something happens" with the 5th and 6th color?


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: users-help@pdfbox.apache.org


Re: PDDeviceN

Posted by Tilman Hausherr <TH...@t-online.de>.
Your code is correct. I found at three (!!!) bugs in our 1.8 code and I 
will create an issue in JIRA and come back to you. Be patient :-) Should 
a black rectangle appear?

Do you have a more advanced postscript code so that one can see that 
"something happens" with the 5th and 6th color?

Tilman

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: users-help@pdfbox.apache.org


Re: PDDeviceN

Posted by Floris <fn...@gmail.com>.
Tilman, thank you very much for your response. I tried to implement your 
suggestion but unfortunately without luck. It just produces:

6 0 obj
<<
/Cs1 /DeviceGray
/Cs2 /DeviceN
 >>
endobj

Here is a working example of my trial. I am indeed using PDFBox version 
1.8.8 and Java 1.8.0_40-ea.

packagecom.here.devicentest;

importorg.apache.pdfbox.cos.*;
importorg.apache.pdfbox.exceptions.COSVisitorException;
importorg.apache.pdfbox.io.RandomAccessBuffer;
importorg.apache.pdfbox.pdmodel.PDDocument;
importorg.apache.pdfbox.pdmodel.PDPage;
importorg.apache.pdfbox.pdmodel.PDResources;
importorg.apache.pdfbox.pdmodel.common.PDRectangle;
importorg.apache.pdfbox.pdmodel.common.function.PDFunctionType4;
importorg.apache.pdfbox.pdmodel.edit.PDPageContentStream;
importorg.apache.pdfbox.pdmodel.font.PDFont;
importorg.apache.pdfbox.pdmodel.font.PDType1Font;
importorg.apache.pdfbox.pdmodel.graphics.color.*;

importjava.io.IOException;
importjava.io.OutputStream;
importjava.lang.String;
importjava.lang.System;
importjava.util.Arrays;
importjava.util.HashMap;
importjava.util.Map;

public classDeviceNTest {

     public static voidmain(String[] args) {

         try{

             WritePDF("MyDeviceN_Test.pdf");
             System.out.println("Done Writing!");

         }catch(IOException e) {
             e.printStackTrace();
         }catch(COSVisitorException e) {
             e.printStackTrace();
         }

     }

     public static voidWritePDF(String filename)throwsIOException, COSVisitorException {

         // Construct the PDF document
         PDDocument doc =newPDDocument();

         // Construct the only page.
         PDPage pdpage =newPDPage();

         // Specify the media box.
         PDRectangle mediabox =newPDRectangle(50,50);
         pdpage.setMediaBox( mediabox );

         // Specify the fonts.
         PDFont currentfont = PDType1Font.HELVETICA;

         // Specify the color spaces.
         Map<String, PDColorSpace> colorspaces =newHashMap<String, PDColorSpace>();

         // Specify DeviceGray for text.
         PDColorSpace cs1 =newPDDeviceGray();

         // Add the color sapce to the color space map.
         colorspaces.put("Cs1", cs1);

         // Specify DeviceN for a rectangle.
         /*
             DeviceN
             - Color Names
             - Alternate Color Space
             - Tint Transform Function
             - Attributes
          */
         PDDeviceN cs2 =newPDDeviceN();

         // - Color Names
         cs2.setColorantNames(Arrays.asList("Cyan","Magenta","Yellow","Black","Orange","Green"));

         // - Alternate Color Space
         cs2.setAlternateColorSpace(PDDeviceCMYK.INSTANCE);

         // - Tint Transform
         /*
             Function Type 4
             - Domain
             - Range
             - Length
             - Type
             - Stream (containing the PS code).
          */
         // - Domain
         COSArray domains =newCOSArray();
         domains.setFloatArray(new float[]{0,1,0,1,0,1,0,1,0,1,0,1});

         // - Range
         COSArray ranges =newCOSArray();
         ranges.setFloatArray(new float[]{0.0f,1.0f,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f});

         // - Dictionary
         COSDictionary functiondata =newCOSDictionary();

         functiondata.setItem(COSName.FUNCTION_TYPE, COSInteger.get(4));
         functiondata.setItem(COSName.DOMAIN, domains);
         functiondata.setItem(COSName.RANGE, ranges);
         functiondata.setItem(COSName.TYPE, COSName.FUNCTION);

         // - Stream
         String functionText ="{pop pop}";

         COSStream functionStream =newCOSStream(functiondata,newRandomAccessBuffer());
         OutputStream out = functionStream.createUnfilteredStream();
         out.write(functionText.getBytes("US-ASCII"));
         out.close();

         // Construct the tint transform function.
         PDFunctionType4 tinttransformfunction = (PDFunctionType4) PDFunctionType4.create(functionStream);

         // Add it to the color space.
         cs2.setTintTransform(tinttransformfunction);

         // - Attributes (just an empty dictionary)
         PDDeviceNAttributes attribs =newPDDeviceNAttributes();
         cs2.setAttributes(attribs);

         // Add the color space to the color space map.
         colorspaces.put("Cs2", cs2);

         // Add the color space map to the page resources.
         PDResources res =newPDResources();
         pdpage.setResources(res);
         pdpage.getResources().setColorSpaces(colorspaces);

         // Add the page to the document.
         doc.addPage( pdpage );


         // Specify the page (pdpage) contents of the PDF file (doc).
         PDPageContentStream contentStream =newPDPageContentStream(doc, pdpage,false,false);

         /*
          Add a rectangle to the page.
          */
         // Set color space
         contentStream.setNonStrokingColorSpace(cs2);
         contentStream.setNonStrokingColor(new float[]{1,1,1,1,1,1});
         contentStream.fillRect(10,10,20,20);

         /*
             Add some text (Hello World) to the page.
          */
         contentStream.beginText();
          floatinitialpointX =0;
          floatinitialpointY =0;

          contentStream.moveTextPositionByAmount(10,10);

         contentStream.setNonStrokingColorSpace(cs1);
         contentStream.setStrokingColor(0.9);
         contentStream.drawString("Hello World!");
         contentStream.endText();

         // Close the stream.
         contentStream.close();

         // Finally save the document.
         doc.save( filename );

         // Close the document.
         if( doc !=null) {
             try{
                 doc.close();
             }catch(IOException e) {
                 e.printStackTrace();
             }
         }
     }
}



On 26-3-2015 17:25, Tilman Hausherr wrote:
> Am 25.03.2015 um 22:52 schrieb Floris:
>> Hey there,
>>
>> I am struggeling getting the PDDeviceN color space to work. I am 
>> trying to create a simple page with one rectangle having a color 
>> defined against a DeviceN space. I tried the following:
>>
>> PDDeviceN cs =newPDDeviceN();
>> cs.setAlternateColorSpace(PDDeviceCMYK.INSTANCE);
>> cs.setColorantNames(Arrays.asList("Cyan","Magenta","Yellow","Black","Orange","Green")); 
>>
>>
>> PDFunction func;
>> COSArray domains =newCOSArray();
>> COSArray ranges =newCOSArray();
>>
>> domains.setFloatArray(new 
>> float[]{0.0f,1.0f,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f});
>> ranges.setFloatArray(new 
>> float[]{0.0f,1.0f,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f});
>>
>> COSDictionary dict=newCOSDictionary();
>> dict.setItem(COSName.FUNCTION_TYPE, COSInteger.get(4));
>> dict.setItem(COSName.DOMAIN, domains);
>> dict.setItem(COSName.RANGE, ranges);
>>
>> try{
>>     func = PDFunction.create(tintdata);
>>         cs.setTintTransform(func);
>> }catch(IOException e) {
>>         e.printStackTrace();
>> }
>>
>> This results in a NullPointerError in the first row of the try-part. 
>> The type4-function should just pop the first two values (to get from 
>> CMYKOG to CMYK). Could someone give me a jump start on how to define 
>> a PDDeviceN space?
>>
>> Have a nice day,
>> Floris
>>
>
>
> Hello,
>
> - tintdata is not defined
> - the postscript code of the type4 function is missing
>
> Here's an excerpt of a PDF file with a type 4 function:
>
>
> 48 0 obj
> <<
> /FunctionType 4
> /Domain [0 1]
> /Range [0 1 0 1 0 1 0 1]
> /Length 62
> >>
> stream
> {dup 0.37 mul exch dup 0 mul exch dup 0.34 mul exch 0.34 mul }
> endstream
> endobj
>
> i.e. your function must have a stream which contains the postscript 
> code. Thus call PDFunction.create() with a COStream. This object 
> should have the dictionary that you already have, and as stream the 
> "code" of the function.
>
>
> COSDictionary dict=newCOSDictionary();
> dict.setItem(COSName.FUNCTION_TYPE, COSInteger.get(4));
> dict.setItem(COSName.DOMAIN, domains);
> dict.setItem(COSName.RANGE, ranges);
>
> String functionText = "{ push pop whatever }";
>
> COSStream functionStream = new COSStream(dict, new RandomAccessBuffer());
> OutputStream out = functionStream.createUnfilteredStream();
> out.write(functionText.getBytes("US-ASCII"));
> out.close();
>
> func = PDFunction.create(functionStream);
>
>
> I didn't test this code. If it doesn't work, please post some complete 
> code that creates a PDF (that fails) and I'll try to help you more 
> (However I can't help you with the postscript code).
>
> Tilman
>
> PS: always mention the version when you ask a question (in your case 
> probably 1.8.*)
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
> For additional commands, e-mail: users-help@pdfbox.apache.org
>


Re: PDDeviceN

Posted by Tilman Hausherr <TH...@t-online.de>.
Am 25.03.2015 um 22:52 schrieb Floris:
> Hey there,
>
> I am struggeling getting the PDDeviceN color space to work. I am 
> trying to create a simple page with one rectangle having a color 
> defined against a DeviceN space. I tried the following:
>
> PDDeviceN cs =newPDDeviceN();
> cs.setAlternateColorSpace(PDDeviceCMYK.INSTANCE);
> cs.setColorantNames(Arrays.asList("Cyan","Magenta","Yellow","Black","Orange","Green")); 
>
>
> PDFunction func;
> COSArray domains =newCOSArray();
> COSArray ranges =newCOSArray();
>
> domains.setFloatArray(new 
> float[]{0.0f,1.0f,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f});
> ranges.setFloatArray(new 
> float[]{0.0f,1.0f,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f});
>
> COSDictionary dict=newCOSDictionary();
> dict.setItem(COSName.FUNCTION_TYPE, COSInteger.get(4));
> dict.setItem(COSName.DOMAIN, domains);
> dict.setItem(COSName.RANGE, ranges);
>
> try{
>     func = PDFunction.create(tintdata);
>         cs.setTintTransform(func);
> }catch(IOException e) {
>         e.printStackTrace();
> }
>
> This results in a NullPointerError in the first row of the try-part. 
> The type4-function should just pop the first two values (to get from 
> CMYKOG to CMYK). Could someone give me a jump start on how to define a 
> PDDeviceN space?
>
> Have a nice day,
> Floris
>


Hello,

- tintdata is not defined
- the postscript code of the type4 function is missing

Here's an excerpt of a PDF file with a type 4 function:


48 0 obj
<<
/FunctionType 4
/Domain [0 1]
/Range [0 1 0 1 0 1 0 1]
/Length 62
 >>
stream
{dup 0.37 mul exch dup 0 mul exch dup 0.34 mul exch 0.34 mul }
endstream
endobj

i.e. your function must have a stream which contains the postscript 
code. Thus call PDFunction.create() with a COStream. This object should 
have the dictionary that you already have, and as stream the "code" of 
the function.


COSDictionary dict=newCOSDictionary();
dict.setItem(COSName.FUNCTION_TYPE, COSInteger.get(4));
dict.setItem(COSName.DOMAIN, domains);
dict.setItem(COSName.RANGE, ranges);

String functionText = "{ push pop whatever }";

COSStream functionStream = new COSStream(dict, new RandomAccessBuffer());
OutputStream out = functionStream.createUnfilteredStream();
out.write(functionText.getBytes("US-ASCII"));
out.close();

func = PDFunction.create(functionStream);


I didn't test this code. If it doesn't work, please post some complete 
code that creates a PDF (that fails) and I'll try to help you more 
(However I can't help you with the postscript code).

Tilman

PS: always mention the version when you ask a question (in your case 
probably 1.8.*)


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: users-help@pdfbox.apache.org