You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@pdfbox.apache.org by "Tilman Hausherr (JIRA)" <ji...@apache.org> on 2014/04/24 17:32:18 UTC
[jira] [Commented] (PDFBOX-2042) ColorSpace with empty Range array
[ https://issues.apache.org/jira/browse/PDFBOX-2042?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13979838#comment-13979838 ]
Tilman Hausherr commented on PDFBOX-2042:
-----------------------------------------
Thanks for the test.
Ouch!!! "private COSArray getRangeArray(int n)" does something sometimes _and_ returns something, and has two bugs. What I think was intended was to extend the range array with default values when needed. However the default values are the wrong ones (should be 0 1 according to the spec, not -100 100, this is for LAB), and the array extension isn't done because of an off-by-one mistake. I have committed a fix in rev 1589767 for the trunk and rev 1589769 for the 1.8 branch.
Before:
{code}
private COSArray getRangeArray(int n)
{
COSArray rangeArray = (COSArray)stream.getStream().getDictionaryObject(COSName.RANGE);
if(rangeArray == null)
{
rangeArray = new COSArray();
stream.getStream().setItem(COSName.RANGE, rangeArray);
while(rangeArray.size() < n*2)
{
rangeArray.add(new COSFloat(-100));
rangeArray.add(new COSFloat(100));
}
}
return rangeArray;
}
{code}
After:
{code}
/**
* Get the range array, create and fill it with default values (0, 1) if
* needed so that it has enough value pairs for the position.
*
* @param pos The zero-based position that should exist after this call is
* completed.
* @return A valid range array.
*/
private COSArray getRangeArray(int pos)
{
//TODO per "clean code", a method should either
// return something or modify something, but not both.
COSArray rangeArray = (COSArray)stream.getStream().getDictionaryObject(COSName.RANGE);
if(rangeArray == null)
{
rangeArray = new COSArray();
stream.getStream().setItem(COSName.RANGE, rangeArray);
}
// extend range array with default values if needed
while (rangeArray.size() < (pos + 1) * 2)
{
rangeArray.add(new COSFloat(0));
rangeArray.add(new COSFloat(1));
}
return rangeArray;
}
{code}
I will try to create a better fix later this week that returns default values if the array doesn't exist or is too small, and creates a correctly sized array for writing operations. This will have the advantage that PDF files don't get longer, i.e. don't have unneeded default range arrays. (This fix creates a default range array)
Btw this bug also resulted in an exception in TestExtractText.
The fixed libs will appear within a few hours here:
https://repository.apache.org/content/groups/snapshots/org/apache/pdfbox/pdfbox/1.8.5-SNAPSHOT/
> ColorSpace with empty Range array
> ---------------------------------
>
> Key: PDFBOX-2042
> URL: https://issues.apache.org/jira/browse/PDFBOX-2042
> Project: PDFBox
> Issue Type: Bug
> Components: PDModel
> Affects Versions: 1.8.4, 1.8.5, 2.0.0
> Reporter: Juraj Lonc
> Assignee: Tilman Hausherr
> Fix For: 1.8.5, 2.0.0
>
> Attachments: ModifyTest.java, pdfbox18.pdf, pdfbox20.pdf
>
>
> I have PDF document where I am modifying PDPage content stream.
> Saved document is invalid (Adobe reader complains about it).
> I have narrowed it down to ColorSpace.
> Original document has colorspace:
> /ColorSpace <<
> /Cs6 [/ICCBased <<
> /Alternate /DeviceRGB
> /Filter /FlateDecode
> /Length 2597
> /N 3
> >>]>>
> Modified document has colorspace:
> /ColorSpace <<
> /Cs6 [/ICCBased <<
> /Alternate /DeviceRGB
> /Filter /FlateDecode
> /Length 2597
> /N 3
> /Range []
> >>]>>
> When I manually remove "/Range []" from PDF then Adobe reader opens it without an error.
> Obviously that range is added by calling PDICCBased.getRangeArray(0) somewhere.
--
This message was sent by Atlassian JIRA
(v6.2#6252)