Skip to content

Commit

Permalink
DEVSIX-8412
Browse files Browse the repository at this point in the history
Autoported commit.
Original commit hash: [b0d6503a6]
Manual files:
pom.xml
  • Loading branch information
Dmitry Radchuk committed Jul 24, 2024
1 parent a1ea9cf commit 516e27d
Show file tree
Hide file tree
Showing 11 changed files with 750 additions and 50 deletions.
33 changes: 33 additions & 0 deletions itext.tests/itext.io.tests/itext/io/source/PdfTokenizerTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,39 @@ public virtual void SeekTest() {
NUnit.Framework.Assert.AreEqual(expectedTypes[2], tok.GetTokenType());
}

[NUnit.Framework.Test]
public virtual void PeekTest() {
String data = "/Name1 70";
PdfTokenizer tokenizer = new PdfTokenizer(new RandomAccessFileOrArray(new RandomAccessSourceFactory().CreateSource
(data.GetBytes(iText.Commons.Utils.EncodingUtil.ISO_8859_1))));
tokenizer.Seek(0);
int symbol = tokenizer.Peek();
NUnit.Framework.Assert.AreEqual((int)'/', symbol);
NUnit.Framework.Assert.AreEqual(0, tokenizer.GetPosition());
tokenizer.Seek(7);
symbol = tokenizer.Peek();
NUnit.Framework.Assert.AreEqual((int)'7', symbol);
NUnit.Framework.Assert.AreEqual(7, tokenizer.GetPosition());
tokenizer.Seek(9);
symbol = tokenizer.Peek();
NUnit.Framework.Assert.AreEqual(-1, symbol);
NUnit.Framework.Assert.AreEqual(9, tokenizer.GetPosition());
byte[] name = new byte[6];
tokenizer.Seek(0);
int read = tokenizer.Peek(name);
byte[] expected = "/Name1".GetBytes();
NUnit.Framework.Assert.AreEqual(expected, name);
NUnit.Framework.Assert.AreEqual(0, tokenizer.GetPosition());
NUnit.Framework.Assert.AreEqual(6, read);
byte[] bigBuffer = new byte[13];
read = tokenizer.Peek(bigBuffer);
expected = new byte[] { (byte)47, (byte)78, (byte)97, (byte)109, (byte)101, (byte)49, (byte)32, (byte)55,
(byte)48, (byte)0, (byte)0, (byte)0, (byte)0 };
NUnit.Framework.Assert.AreEqual(expected, bigBuffer);
NUnit.Framework.Assert.AreEqual(0, tokenizer.GetPosition());
NUnit.Framework.Assert.AreEqual(9, read);
}

[NUnit.Framework.Test]
public virtual void GetLongValueTest() {
String data = "21474836470";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,20 +99,17 @@ public virtual void ParseInlineImageTest() {
}

private class InlineImageEventListener : IEventListener {
private IList<PdfStream> inlineImages = new List<PdfStream>();
private readonly IList<PdfStream> inlineImages = new List<PdfStream>();

public virtual IList<PdfStream> GetInlineImages() {
return inlineImages;
}

public virtual void EventOccurred(IEventData data, EventType type) {
switch (type) {
case EventType.RENDER_IMAGE: {
ImageRenderInfo imageEventData = (ImageRenderInfo)data;
if (((ImageRenderInfo)data).IsInline()) {
inlineImages.Add(imageEventData.GetImage().GetPdfObject());
}
break;
if (type == EventType.RENDER_IMAGE) {
ImageRenderInfo imageEventData = (ImageRenderInfo)data;
if (((ImageRenderInfo)data).IsInline()) {
inlineImages.Add(imageEventData.GetImage().GetPdfObject());
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,20 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
using System;
using System.Collections.Generic;
using System.IO;
using iText.Commons.Utils;
using iText.IO.Source;
using iText.Kernel.Exceptions;
using iText.Kernel.Pdf;
using iText.Test;

namespace iText.Kernel.Pdf.Canvas.Parser.Util {
[NUnit.Framework.Category("UnitTest")]
public class InlineImageParsingUtilsTest : ExtendedITextTest {
private static readonly String RESOURCE_FOLDER = iText.Test.TestUtil.GetParentProjectDirectory(NUnit.Framework.TestContext
.CurrentContext.TestDirectory) + "/resources/itext/kernel/pdf/canvas/parser/InlineImageParsingUtilsTest/";

[NUnit.Framework.Test]
public virtual void IccBasedCsTest() {
PdfName colorSpace = PdfName.ICCBased;
Expand Down Expand Up @@ -108,5 +114,60 @@ public virtual void DeviceCMYKCsTest() {
PdfName colorSpace = PdfName.DeviceCMYK;
NUnit.Framework.Assert.AreEqual(4, InlineImageParsingUtils.GetComponentsPerPixel(colorSpace, null));
}

[NUnit.Framework.Test]
public virtual void ParseLargeImageWithEndMarkerInDataTest() {
PdfTokenizer tokenizer = new PdfTokenizer(new RandomAccessFileOrArray(new RandomAccessSourceFactory().CreateSource
(File.ReadAllBytes(System.IO.Path.Combine(RESOURCE_FOLDER + "img.dat")))));
PdfCanvasParser ps = new PdfCanvasParser(tokenizer, new PdfResources());
IList<PdfObject> objects = ps.Parse(null);
NUnit.Framework.Assert.AreEqual(2, objects.Count);
NUnit.Framework.Assert.IsTrue(objects[0] is PdfStream);
NUnit.Framework.Assert.AreEqual(new PdfLiteral("EI"), objects[1]);
//Getting encoded bytes of an image, can't use PdfStream#getBytes() here because it decodes an image
byte[] image = ((ByteArrayOutputStream)((PdfStream)objects[0]).GetOutputStream().GetOutputStream()).ToArray
();
byte[] cmpImage = File.ReadAllBytes(System.IO.Path.Combine(RESOURCE_FOLDER, "cmp_img.dat"));
NUnit.Framework.Assert.AreEqual(cmpImage, image);
}

[NUnit.Framework.Test]
public virtual void BinaryDataProbationTest() {
TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI Q", "inline image data");
TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI EMC", "inline image data");
TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI S", "inline image data");
TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI EMC", "inline image data");
TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI \x0Q", "inline image data");
TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI Q ", "inline image data");
TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI EMC ", "inline image data");
TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI ", "inline image data");
TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI Q ", "inline image data");
TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI EMC ", "inline image data");
TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI ", "inline image data");
TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI QEI", "inline image data");
TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/ EI ", "inline image data");
// 2nd EI is taken into account
TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/ EI DDDEI ", "inline image dat`ûGÔn");
TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI SEI Q", "inline image data");
TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI \u0000", "inline image data");
TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI \u007f", "inline image data");
TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI \u0000pdf", "inline image data");
TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI \u0000pdf\u0000\u0000\u0000", "inline image data");
}

private void TestInlineImage(String imgData, String cmpImgData) {
String data = "BI\n" + "/Width 10\n" + "/Height 10\n" + "/BitsPerComponent 8\n" + "/ColorSpace /DeviceRGB\n"
+ "/Filter [/ASCII85Decode]\n" + imgData;
PdfTokenizer tokenizer = new PdfTokenizer(new RandomAccessFileOrArray(new RandomAccessSourceFactory().CreateSource
(data.GetBytes(iText.Commons.Utils.EncodingUtil.ISO_8859_1))));
PdfCanvasParser ps = new PdfCanvasParser(tokenizer, new PdfResources());
IList<PdfObject> objects = ps.Parse(null);
NUnit.Framework.Assert.AreEqual(2, objects.Count);
NUnit.Framework.Assert.IsTrue(objects[0] is PdfStream);
NUnit.Framework.Assert.AreEqual(new PdfLiteral("EI"), objects[1]);
String image = iText.Commons.Utils.JavaUtil.GetStringForBytes(((PdfStream)objects[0]).GetBytes(), iText.Commons.Utils.EncodingUtil.ISO_8859_1
);
NUnit.Framework.Assert.AreEqual(image, cmpImgData);
}
}
}
Loading

0 comments on commit 516e27d

Please sign in to comment.