mirror of
https://github.com/UglyToad/PdfPig.git
synced 2025-12-21 11:13:55 +08:00
allow stream filters to contain indirect references to name tokens
This commit is contained in:
@@ -2,9 +2,10 @@
|
|||||||
{
|
{
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using PdfPig.Filters;
|
using PdfPig.Filters;
|
||||||
|
using PdfPig.Tokenization.Scanner;
|
||||||
using PdfPig.Tokens;
|
using PdfPig.Tokens;
|
||||||
|
|
||||||
internal class TestFilterProvider : IFilterProvider
|
internal class TestFilterProvider : ILookupFilterProvider
|
||||||
{
|
{
|
||||||
public IReadOnlyList<IFilter> GetFilters(DictionaryToken dictionary)
|
public IReadOnlyList<IFilter> GetFilters(DictionaryToken dictionary)
|
||||||
{
|
{
|
||||||
@@ -20,5 +21,10 @@
|
|||||||
{
|
{
|
||||||
return new List<IFilter>();
|
return new List<IFilter>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IReadOnlyList<IFilter> GetFilters(DictionaryToken dictionary, IPdfTokenScanner scanner)
|
||||||
|
{
|
||||||
|
return new List<IFilter>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -15,7 +15,9 @@
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void ReadsSimpleObject()
|
public void ReadsSimpleObject()
|
||||||
{
|
{
|
||||||
const string s = @"294 0 obj
|
const string s = @"294 0 obj
|
||||||
|
/WDKAAR+CMBX12
|
||||||
|
endobj";
|
||||||
|
|
||||||
var pdfScanner = GetScanner(s);
|
var pdfScanner = GetScanner(s);
|
||||||
|
|
||||||
@@ -116,7 +118,15 @@ endobj
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void ReadsArrayObject()
|
public void ReadsArrayObject()
|
||||||
{
|
{
|
||||||
public void ReadsArrayObject()
|
const string s = @"
|
||||||
|
endobj
|
||||||
|
|
||||||
|
295 0 obj
|
||||||
|
[
|
||||||
|
676 938 875 787 750 880 813 875 813 875 813 656 625 625 938 938 313
|
||||||
|
344 563 563 563 563 563 850 500 574 813 875 563 1019 1144 875 313
|
||||||
|
]
|
||||||
|
endobj";
|
||||||
|
|
||||||
var pdfScanner = GetScanner(s);
|
var pdfScanner = GetScanner(s);
|
||||||
|
|
||||||
@@ -143,8 +153,29 @@ endobj
|
|||||||
{
|
{
|
||||||
const string s = @"
|
const string s = @"
|
||||||
|
|
||||||
Assert.StartsWith("295 0 obj", s.Substring((int)obj.Position));
|
274 0 obj
|
||||||
|
<<
|
||||||
|
/Type /Pages
|
||||||
|
/Count 2
|
||||||
|
/Parent 275 0 R
|
||||||
|
/Kids [ 121 0 R 125 0 R ]
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
|
||||||
|
%Other parts...
|
||||||
|
|
||||||
|
310 0 obj
|
||||||
|
/WPXNWT+CMR9
|
||||||
|
endobj 311 0 obj
|
||||||
|
<<
|
||||||
|
/Type /Font
|
||||||
|
/Subtype /Type1
|
||||||
|
/FirstChar 0
|
||||||
|
/LastChar 127
|
||||||
|
/Widths 313 0 R
|
||||||
|
/BaseFont 310 0 R /FontDescriptor 312 0 R
|
||||||
|
>>
|
||||||
|
endobj";
|
||||||
|
|
||||||
var scanner = GetScanner(s);
|
var scanner = GetScanner(s);
|
||||||
|
|
||||||
@@ -191,12 +222,17 @@ endobj
|
|||||||
public void ReadsStreamObject()
|
public void ReadsStreamObject()
|
||||||
{
|
{
|
||||||
const string s = @"
|
const string s = @"
|
||||||
Assert.StartsWith("310 0 obj", s.Substring((int)tokens[1].Position));
|
352 0 obj
|
||||||
|
<< /S 1273 /Filter /FlateDecode /Length 353 0 R >>
|
||||||
dictionary = Assert.IsType<DictionaryToken>(tokens[2].Data);
|
stream
|
||||||
|
H‰œUkLSgþÚh¹IÝÅlK(%[ÈÅ©+ƒåꩊèæÇtnZ)Z¹¨Oå~9ŠÊµo”[éiK)÷B¹´
|
||||||
Assert.Equal(7, dictionary.Data.Count);
|
ɲ ©¸˜ n±º×dKöcÏ÷ãœç{ßï}¾÷ÍÉs Ô;€
|
||||||
Assert.Equal(311, tokens[2].Number.ObjectNumber);
|
À»—ÀF`ÇF@ƒ4˜ï @¥T¨³fY: žw̵;’’Îq®]cƒÿdp¨ÛI3F#G©#œ)TÇqW£NÚѬgOKbü‡µ#á¡£Þaîtƒƒ›ß–
|
||||||
|
¾“S>}µuÕõ5M±¢ª†»øÞû•q÷îÜ~¬PòžÞ~•¬ëɃGÅ-Ñím·°gêêb,/,£P§õ^v¾ãÁô¿¿ŠTE]²±{šuwÔ`LG³DªìTÈ
|
||||||
|
A¡¬àð‰É©ˆ°‘¼›‚%¥×s³®í»š}%§X{{tøNåÝž¶ö¢ÖÞ¾–~´¼¬°À“Éððr¥8»P£ØêÁi½®Û(éhŽ‘ú;x#dÃÄ$m
|
||||||
|
+)
|
||||||
|
)†…±n
|
||||||
|
9ùyŽA·n\ï»t!=3£½¡:®µåâ¹Ô³ø¼ËiûSÎsë;•Dt—ö$WÉ4U‘¢ºÚšñá1íÐèÔó‚svõ(/(+D²#mZÏ6êüÝ7x‡—†”‡E„²‚|ê«êªDµ5q°šR¦RÈ£n¾[è~“}ýƒÝ½SꞦ'æQŽzÝ‚mæ
|
||||||
óF+Õ%ù‡ƒß9SˆŒÓãšH¶~L-#T]êîÁ©ÎkbjÒp½¸$¤´(4<,""øfvΕ< VЫ#4'2l'Ð1ñðn?sìûãI'OŸøñçŸN5(äÊ'âÎѾÞþíðƒQmu}]Õ£‡c›©.Œòµ9zz0Ѳ‚B¢«#š-3ªà<cš¥’¡È¨qµ¦{pìÛ„Ã‡ŽŠ/íO»|áIclSCuo_Oœ\\ï!ª©«ªƒTþ5Ó‹™Ü”óî_9|ýÍ7ø!Ñý|2Goÿ€Î¶Öö…<ðáƒGéGá½G´Ã.®TŠóî=_|þ™‡ƒééFwßà 0æîc_Ó릳|ý|¶®æ„…†G8Òüï€l…\¦RFº:‰ VPð•S“Û¶ï V—ø/¿¾Xæ+«««ÖŽ4>ŸŸ¦Pà8®Ó…¼æ¢BaÅÐkëÊŠukÈÊÖL£ivvv…k2=µZMØ|Úl(ŠZV›ÍbI>Ÿl¹œ(â±Äbø”Uªñeü©U*‹’“Oð,„E+¶Êà>ŽU”ÎÌõçlºFÃ_ÃÙl?¶=>>!>þC¿-×à©©©x¾€¢ŠÊåòtÃ0‹Æôz“‰ NÊ,¬‚kÀ°F‚XÛ4&“ÉfÃñÅæûæy=ÆãIðE_¾Èårår/XÞ„/·qò›m¶ìÖ|†óx8Wð¹hºÜÂÕalÎü’˜Ã0^Òòòü¼yÞ¶´´DX
|
óF+Õ%ù‡ƒß9SˆŒÓãšH¶~L-#T]êîÁ©ÎkbjÒp½¸$¤´(4<,""øfvΕ< VЫ#4'2l'Ð1ñðn?sìûãI'OŸøñçŸN5(äÊ'âÎѾÞþíðƒQmu}]Õ£‡c›©.Œòµ9zz0Ѳ‚B¢«#š-3ªà<cš¥’¡È¨qµ¦{pìÛ„Ã‡ŽŠ/íO»|áIclSCuo_Oœ\\ï!ª©«ªƒTþ5Ó‹™Ü”óî_9|ýÍ7ø!Ñý|2Goÿ€Î¶Öö…<ðáƒGéGá½G´Ã.®TŠóî=_|þ™‡ƒééFwßà 0æîc_Ó릳|ý|¶®æ„…†G8Òüï€l…\¦RFº:‰ VPð•S“Û¶ï V—ø/¿¾Xæ+«««ÖŽ4>ŸŸ¦Pà8®Ó…¼æ¢BaÅÐkëÊŠukÈÊÖL£ivvv…k2=µZMØ|Úl(ŠZV›ÍbI>Ÿl¹œ(â±Äbø”Uªñeü©U*‹’“Oð,„E+¶Êà>ŽU”ÎÌõçlºFÃ_ÃÙl?¶=>>!>þC¿-×à©©©x¾€¢ŠÊåòtÃ0‹Æôz“‰ NÊ,¬‚kÀ°F‚XÛ4&“ÉfÃñÅæûæy=ÆãIðE_¾Èårår/XÞ„/·qò›m¶ìÖ|†óx8Wð¹hºÜÂÕalÎü’˜Ã0^Òòòü¼yÞ¶´´DX
|
||||||
)¨ÇM8lüM…Oúý| 1Ïãk»:t<…ÂÚl¶e¾†” éKÜl6c¹¸É„› ”)‰'3¤œ\–™ËN–™ÿe^в y÷ð¹f`3ëž´ ¸“$d:e†)!%2ºdvË@½N¼ªŠ Ùná¹ ¼¿@€Ã.èšs ì÷ûM€2(E4_ | FÑ.@v@÷¤ÃÅ0È Pž~,€:»H¤k¾hT Œ € êÇV:Ô…©@@oH¯(3T‰{""C½SñŠœþtz3€•ƒ ñf.¬SÐøzWþ*$9gj=~Ì·QD E6o¥Ûi/Â`1ígGMq,;}޼sÔ×®kDü˜J{e5‚²ìÉ~Y)}fA>:˜ù–""Yò ç¹=ù²yÛ¡¿i aœ‘ØÏºþÇoäO ôkÆ)
|
)¨ÇM8lüM…Oúý| 1Ïãk»:t<…ÂÚl¶e¾†” éKÜl6c¹¸É„› ”)‰'3¤œ\–™ËN–™ÿe^в y÷ð¹f`3ëž´ ¸“$d:e†)!%2ºdvË@½N¼ªŠ Ùná¹ ¼¿@€Ã.èšs ì÷ûM€2(E4_ | FÑ.@v@÷¤ÃÅ0È Pž~,€:»H¤k¾hT Œ € êÇV:Ô…©@@oH¯(3T‰{""C½SñŠœþtz3€•ƒ ñf.¬SÐøzWþ*$9gj=~Ì·QD E6o¥Ûi/Â`1ígGMq,;}޼sÔ×®kDü˜J{e5‚²ìÉ~Y)}fA>:˜ù–""Yò ç¹=ù²yÛ¡¿i aœ‘ØÏºþÇoäO ôkÆ)
|
||||||
endstream
|
endstream
|
||||||
@@ -321,7 +357,7 @@ endobj
|
|||||||
<< /Length 288
|
<< /Length 288
|
||||||
/Filter /FlateDecode >>
|
/Filter /FlateDecode >>
|
||||||
stream
|
stream
|
||||||
{
|
xœ]‘ËjÃ0E÷ÿÃ,ÓEð#NÒ€1¤N^ôA~€-]A-YYøï+Ï4¡t#qfîFWQY*Dïv5:è”–§ñjB‹½Òa¤ •p7¤K ƒÈûëyr8Tº!Ïà úð‚ÉÙVG9¶ø@Å7+Ñ*ÝÃ곬¹T_ùƵƒ8Š$vË̗Ƽ6BDöu%½B¹yí$—Ù ¤\Hx71JœL#Ð6ºÇ0È㸀ü|. µüßõÏ""WÛ‰¯Æ.êÄ«ã8;¤iL°!Ø %É`K°ßì¸ÃöÜáÜ) [‚#CFðİ#(yƒg^ÿ¶æò
|
||||||
ÿž“¸Zë#¢?¢h–P”Æû?šÑï÷ø¯‰Šendstream
|
ÿž“¸Zë#¢?¢h–P”Æû?šÑï÷ø¯‰Šendstream
|
||||||
endobj
|
endobj
|
||||||
|
|
||||||
@@ -339,7 +375,31 @@ endobj";
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void ReadsStringsWithMissingEndBracket()
|
public void ReadsStringsWithMissingEndBracket()
|
||||||
{
|
{
|
||||||
|
const string input = @"5 0 obj
|
||||||
|
<<
|
||||||
|
/Kids [4 0 R 12 0 R 17 0 R 20 0 R 25 0 R 28 0 R ]
|
||||||
|
/Count 6
|
||||||
|
/Type /Pages
|
||||||
|
/MediaBox [ 0 0 612 792 ]
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
1 0 obj
|
||||||
|
<<
|
||||||
|
/Creator (Corel WordPerfect - [D:\Wpdocs\WEBSITE\PROC&POL.WP6 (unmodified)
|
||||||
|
/CreationDate (D:19980224130723)
|
||||||
|
/Title (Proc&Pol.pdf)
|
||||||
|
/Author (J. L. Swezey)
|
||||||
|
/Producer (Acrobat PDFWriter 3.03 for Windows NT)
|
||||||
|
/Keywords (Budapest Treaty; Patent deposits; IDA)
|
||||||
|
/Subject (Patent Collection Procedures and Policies)
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
3 0 obj
|
||||||
|
<<
|
||||||
|
/Pages 5 0 R
|
||||||
|
/Type /Catalog
|
||||||
|
>>
|
||||||
|
endobj";
|
||||||
|
|
||||||
var scanner = GetScanner(input);
|
var scanner = GetScanner(input);
|
||||||
|
|
||||||
|
|||||||
@@ -9,4 +9,8 @@
|
|||||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=RGB/@EntryIndexedValue">RGB</s:String>
|
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=RGB/@EntryIndexedValue">RGB</s:String>
|
||||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=XY/@EntryIndexedValue">XY</s:String>
|
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=XY/@EntryIndexedValue">XY</s:String>
|
||||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateInstanceFields/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /></s:String>
|
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateInstanceFields/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /></s:String>
|
||||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateStaticFields/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /></s:String></wpf:ResourceDictionary>
|
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateStaticFields/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /></s:String>
|
||||||
|
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpKeepExistingMigration/@EntryIndexedValue">True</s:Boolean>
|
||||||
|
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpPlaceEmbeddedOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
|
||||||
|
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpUseContinuousIndentInsideBracesMigration/@EntryIndexedValue">True</s:Boolean>
|
||||||
|
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
||||||
@@ -6,7 +6,6 @@
|
|||||||
using Content;
|
using Content;
|
||||||
using Core;
|
using Core;
|
||||||
using CrossReference;
|
using CrossReference;
|
||||||
using Exceptions;
|
|
||||||
using Fields;
|
using Fields;
|
||||||
using Filters;
|
using Filters;
|
||||||
using Parser.Parts;
|
using Parser.Parts;
|
||||||
@@ -30,10 +29,10 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
private readonly IPdfTokenScanner tokenScanner;
|
private readonly IPdfTokenScanner tokenScanner;
|
||||||
private readonly IFilterProvider filterProvider;
|
private readonly ILookupFilterProvider filterProvider;
|
||||||
private readonly CrossReferenceTable crossReferenceTable;
|
private readonly CrossReferenceTable crossReferenceTable;
|
||||||
|
|
||||||
public AcroFormFactory(IPdfTokenScanner tokenScanner, IFilterProvider filterProvider, CrossReferenceTable crossReferenceTable)
|
public AcroFormFactory(IPdfTokenScanner tokenScanner, ILookupFilterProvider filterProvider, CrossReferenceTable crossReferenceTable)
|
||||||
{
|
{
|
||||||
this.tokenScanner = tokenScanner ?? throw new ArgumentNullException(nameof(tokenScanner));
|
this.tokenScanner = tokenScanner ?? throw new ArgumentNullException(nameof(tokenScanner));
|
||||||
this.filterProvider = filterProvider ?? throw new ArgumentNullException(nameof(filterProvider));
|
this.filterProvider = filterProvider ?? throw new ArgumentNullException(nameof(filterProvider));
|
||||||
@@ -314,7 +313,7 @@
|
|||||||
}
|
}
|
||||||
else if (DirectObjectFinder.TryGet(textValueToken, tokenScanner, out StreamToken valueStreamToken))
|
else if (DirectObjectFinder.TryGet(textValueToken, tokenScanner, out StreamToken valueStreamToken))
|
||||||
{
|
{
|
||||||
textValue = OtherEncodings.BytesAsLatin1String(valueStreamToken.Decode(filterProvider).ToArray());
|
textValue = OtherEncodings.BytesAsLatin1String(valueStreamToken.Decode(filterProvider, tokenScanner).ToArray());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,13 +16,13 @@
|
|||||||
public class AdvancedPdfDocumentAccess : IDisposable
|
public class AdvancedPdfDocumentAccess : IDisposable
|
||||||
{
|
{
|
||||||
private readonly IPdfTokenScanner pdfScanner;
|
private readonly IPdfTokenScanner pdfScanner;
|
||||||
private readonly IFilterProvider filterProvider;
|
private readonly ILookupFilterProvider filterProvider;
|
||||||
private readonly Catalog catalog;
|
private readonly Catalog catalog;
|
||||||
|
|
||||||
private bool isDisposed;
|
private bool isDisposed;
|
||||||
|
|
||||||
internal AdvancedPdfDocumentAccess(IPdfTokenScanner pdfScanner,
|
internal AdvancedPdfDocumentAccess(IPdfTokenScanner pdfScanner,
|
||||||
IFilterProvider filterProvider,
|
ILookupFilterProvider filterProvider,
|
||||||
Catalog catalog)
|
Catalog catalog)
|
||||||
{
|
{
|
||||||
this.pdfScanner = pdfScanner ?? throw new ArgumentNullException(nameof(pdfScanner));
|
this.pdfScanner = pdfScanner ?? throw new ArgumentNullException(nameof(pdfScanner));
|
||||||
@@ -73,7 +73,7 @@
|
|||||||
fileSpecification = fileSpecificationToken.Data;
|
fileSpecification = fileSpecificationToken.Data;
|
||||||
}
|
}
|
||||||
|
|
||||||
var fileBytes = fileStreamToken.Decode(filterProvider);
|
var fileBytes = fileStreamToken.Decode(filterProvider, pdfScanner);
|
||||||
|
|
||||||
result.Add(new EmbeddedFile(keyValuePair.Key, fileSpecification, fileBytes, fileStreamToken));
|
result.Add(new EmbeddedFile(keyValuePair.Key, fileSpecification, fileBytes, fileStreamToken));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
private readonly IReadOnlyList<Union<XObjectContentRecord, InlineImage>> images;
|
private readonly IReadOnlyList<Union<XObjectContentRecord, InlineImage>> images;
|
||||||
private readonly IReadOnlyList<MarkedContentElement> markedContents;
|
private readonly IReadOnlyList<MarkedContentElement> markedContents;
|
||||||
private readonly IPdfTokenScanner pdfScanner;
|
private readonly IPdfTokenScanner pdfScanner;
|
||||||
private readonly IFilterProvider filterProvider;
|
private readonly ILookupFilterProvider filterProvider;
|
||||||
private readonly IResourceStore resourceStore;
|
private readonly IResourceStore resourceStore;
|
||||||
|
|
||||||
internal IReadOnlyList<IGraphicsStateOperation> GraphicsStateOperations { get; }
|
internal IReadOnlyList<IGraphicsStateOperation> GraphicsStateOperations { get; }
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
IReadOnlyList<Union<XObjectContentRecord, InlineImage>> images,
|
IReadOnlyList<Union<XObjectContentRecord, InlineImage>> images,
|
||||||
IReadOnlyList<MarkedContentElement> markedContents,
|
IReadOnlyList<MarkedContentElement> markedContents,
|
||||||
IPdfTokenScanner pdfScanner,
|
IPdfTokenScanner pdfScanner,
|
||||||
IFilterProvider filterProvider,
|
ILookupFilterProvider filterProvider,
|
||||||
IResourceStore resourceStore)
|
IResourceStore resourceStore)
|
||||||
{
|
{
|
||||||
GraphicsStateOperations = graphicsStateOperations;
|
GraphicsStateOperations = graphicsStateOperations;
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
using System.Xml.Linq;
|
using System.Xml.Linq;
|
||||||
using Core;
|
using Core;
|
||||||
using Filters;
|
using Filters;
|
||||||
|
using Tokenization.Scanner;
|
||||||
using Tokens;
|
using Tokens;
|
||||||
using Util.JetBrains.Annotations;
|
using Util.JetBrains.Annotations;
|
||||||
|
|
||||||
@@ -15,7 +16,8 @@
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class XmpMetadata
|
public class XmpMetadata
|
||||||
{
|
{
|
||||||
private readonly IFilterProvider filterProvider;
|
private readonly ILookupFilterProvider filterProvider;
|
||||||
|
private readonly IPdfTokenScanner pdfTokenScanner;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The underlying <see cref="StreamToken"/> for this metadata.
|
/// The underlying <see cref="StreamToken"/> for this metadata.
|
||||||
@@ -23,9 +25,10 @@
|
|||||||
[NotNull]
|
[NotNull]
|
||||||
public StreamToken MetadataStreamToken { get; }
|
public StreamToken MetadataStreamToken { get; }
|
||||||
|
|
||||||
internal XmpMetadata(StreamToken stream, IFilterProvider filterProvider)
|
internal XmpMetadata(StreamToken stream, ILookupFilterProvider filterProvider, IPdfTokenScanner pdfTokenScanner)
|
||||||
{
|
{
|
||||||
this.filterProvider = filterProvider ?? throw new ArgumentNullException(nameof(filterProvider));
|
this.filterProvider = filterProvider ?? throw new ArgumentNullException(nameof(filterProvider));
|
||||||
|
this.pdfTokenScanner = pdfTokenScanner;
|
||||||
MetadataStreamToken = stream ?? throw new ArgumentNullException(nameof(stream));
|
MetadataStreamToken = stream ?? throw new ArgumentNullException(nameof(stream));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35,7 +38,7 @@
|
|||||||
/// <returns>The bytes for the metadata object with any filters removed.</returns>
|
/// <returns>The bytes for the metadata object with any filters removed.</returns>
|
||||||
public IReadOnlyList<byte> GetXmlBytes()
|
public IReadOnlyList<byte> GetXmlBytes()
|
||||||
{
|
{
|
||||||
return MetadataStreamToken.Decode(filterProvider);
|
return MetadataStreamToken.Decode(filterProvider, pdfTokenScanner);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -117,5 +117,6 @@
|
|||||||
{
|
{
|
||||||
return filterInstances.Values.Distinct().ToList();
|
return filterInstances.Values.Distinct().ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
73
src/UglyToad.PdfPig/Filters/FilterProviderWithLookup.cs
Normal file
73
src/UglyToad.PdfPig/Filters/FilterProviderWithLookup.cs
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
namespace UglyToad.PdfPig.Filters
|
||||||
|
{
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Core;
|
||||||
|
using Parser.Parts;
|
||||||
|
using Tokenization.Scanner;
|
||||||
|
using Tokens;
|
||||||
|
|
||||||
|
internal class FilterProviderWithLookup : ILookupFilterProvider
|
||||||
|
{
|
||||||
|
private readonly IFilterProvider inner;
|
||||||
|
|
||||||
|
public FilterProviderWithLookup(IFilterProvider inner)
|
||||||
|
{
|
||||||
|
this.inner = inner;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IReadOnlyList<IFilter> GetFilters(DictionaryToken dictionary)
|
||||||
|
=> inner.GetFilters(dictionary);
|
||||||
|
|
||||||
|
public IReadOnlyList<IFilter> GetNamedFilters(IReadOnlyList<NameToken> names)
|
||||||
|
=> inner.GetNamedFilters(names);
|
||||||
|
|
||||||
|
public IReadOnlyList<IFilter> GetAllFilters()
|
||||||
|
=> inner.GetAllFilters();
|
||||||
|
|
||||||
|
public IReadOnlyList<IFilter> GetFilters(DictionaryToken dictionary, IPdfTokenScanner scanner)
|
||||||
|
{
|
||||||
|
if (dictionary == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(dictionary));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!dictionary.TryGet(NameToken.Filter, out var token))
|
||||||
|
{
|
||||||
|
return EmptyArray<IFilter>.Instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (token)
|
||||||
|
{
|
||||||
|
case ArrayToken filters:
|
||||||
|
var result = new NameToken[filters.Data.Count];
|
||||||
|
for (var i = 0; i < filters.Data.Count; i++)
|
||||||
|
{
|
||||||
|
var filterToken = filters.Data[i];
|
||||||
|
var filterName = (NameToken)filterToken;
|
||||||
|
result[i] = filterName;
|
||||||
|
}
|
||||||
|
|
||||||
|
return GetNamedFilters(result);
|
||||||
|
case NameToken name:
|
||||||
|
return GetNamedFilters(new[] {name});
|
||||||
|
case IndirectReferenceToken irt:
|
||||||
|
if (DirectObjectFinder.TryGet<NameToken>(irt, scanner, out var indirectName))
|
||||||
|
{
|
||||||
|
return GetNamedFilters(new []{ indirectName });
|
||||||
|
}
|
||||||
|
else if (DirectObjectFinder.TryGet<ArrayToken>(irt, scanner, out var indirectArray))
|
||||||
|
{
|
||||||
|
return GetNamedFilters(indirectArray.Data.Select(x => (NameToken) x).ToList());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new PdfDocumentFormatException($"The filter for the stream was not a valid object. Expected name or array, instead got: {token}.");
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
throw new PdfDocumentFormatException($"The filter for the stream was not a valid object. Expected name or array, instead got: {token}.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
namespace UglyToad.PdfPig.Filters
|
namespace UglyToad.PdfPig.Filters
|
||||||
{
|
{
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using Tokenization.Scanner;
|
||||||
using Tokens;
|
using Tokens;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -23,4 +24,9 @@
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
IReadOnlyList<IFilter> GetAllFilters();
|
IReadOnlyList<IFilter> GetAllFilters();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal interface ILookupFilterProvider : IFilterProvider
|
||||||
|
{
|
||||||
|
IReadOnlyList<IFilter> GetFilters(DictionaryToken dictionary, IPdfTokenScanner scanner);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Tokenization.Scanner;
|
using Tokenization.Scanner;
|
||||||
using Tokens;
|
using Tokens;
|
||||||
using UglyToad.PdfPig.Graphics.Operations.TextPositioning;
|
using Operations.TextPositioning;
|
||||||
using XObjects;
|
using XObjects;
|
||||||
using static PdfPig.Core.PdfSubpath;
|
using static PdfPig.Core.PdfSubpath;
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
private readonly PageRotationDegrees rotation;
|
private readonly PageRotationDegrees rotation;
|
||||||
private readonly IPdfTokenScanner pdfScanner;
|
private readonly IPdfTokenScanner pdfScanner;
|
||||||
private readonly IPageContentParser pageContentParser;
|
private readonly IPageContentParser pageContentParser;
|
||||||
private readonly IFilterProvider filterProvider;
|
private readonly ILookupFilterProvider filterProvider;
|
||||||
private readonly ILog log;
|
private readonly ILog log;
|
||||||
private readonly bool clipPaths;
|
private readonly bool clipPaths;
|
||||||
private readonly PdfVector pageSize;
|
private readonly PdfVector pageSize;
|
||||||
@@ -88,7 +88,7 @@
|
|||||||
public ContentStreamProcessor(PdfRectangle cropBox, IResourceStore resourceStore, UserSpaceUnit userSpaceUnit, PageRotationDegrees rotation,
|
public ContentStreamProcessor(PdfRectangle cropBox, IResourceStore resourceStore, UserSpaceUnit userSpaceUnit, PageRotationDegrees rotation,
|
||||||
IPdfTokenScanner pdfScanner,
|
IPdfTokenScanner pdfScanner,
|
||||||
IPageContentParser pageContentParser,
|
IPageContentParser pageContentParser,
|
||||||
IFilterProvider filterProvider,
|
ILookupFilterProvider filterProvider,
|
||||||
ILog log,
|
ILog log,
|
||||||
bool clipPaths,
|
bool clipPaths,
|
||||||
PdfVector pageSize)
|
PdfVector pageSize)
|
||||||
@@ -448,7 +448,7 @@
|
|||||||
|
|
||||||
startState.CurrentTransformationMatrix = resultingTransformationMatrix;
|
startState.CurrentTransformationMatrix = resultingTransformationMatrix;
|
||||||
|
|
||||||
var contentStream = formStream.Decode(filterProvider);
|
var contentStream = formStream.Decode(filterProvider, pdfScanner);
|
||||||
|
|
||||||
var operations = pageContentParser.Parse(pageNumber, new ByteArrayInputBytes(contentStream), log);
|
var operations = pageContentParser.Parse(pageNumber, new ByteArrayInputBytes(contentStream), log);
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
public IReadOnlyList<byte> Bytes { get; set; }
|
public IReadOnlyList<byte> Bytes { get; set; }
|
||||||
|
|
||||||
public InlineImage CreateInlineImage(TransformationMatrix transformationMatrix, IFilterProvider filterProvider,
|
public InlineImage CreateInlineImage(TransformationMatrix transformationMatrix, ILookupFilterProvider filterProvider,
|
||||||
IPdfTokenScanner tokenScanner,
|
IPdfTokenScanner tokenScanner,
|
||||||
RenderingIntent defaultRenderingIntent,
|
RenderingIntent defaultRenderingIntent,
|
||||||
IResourceStore resourceStore)
|
IResourceStore resourceStore)
|
||||||
@@ -28,8 +28,6 @@
|
|||||||
throw new InvalidOperationException($"Inline image builder not completely defined before calling {nameof(CreateInlineImage)}.");
|
throw new InvalidOperationException($"Inline image builder not completely defined before calling {nameof(CreateInlineImage)}.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var bounds = transformationMatrix.Transform(new PdfRectangle(new PdfPoint(1, 1),
|
var bounds = transformationMatrix.Transform(new PdfRectangle(new PdfPoint(1, 1),
|
||||||
new PdfPoint(0, 0)));
|
new PdfPoint(0, 0)));
|
||||||
|
|
||||||
|
|||||||
@@ -69,7 +69,7 @@
|
|||||||
|
|
||||||
public void AddXObject(XObjectContentRecord xObject,
|
public void AddXObject(XObjectContentRecord xObject,
|
||||||
IPdfTokenScanner scanner,
|
IPdfTokenScanner scanner,
|
||||||
IFilterProvider filterProvider,
|
ILookupFilterProvider filterProvider,
|
||||||
IResourceStore resourceStore)
|
IResourceStore resourceStore)
|
||||||
{
|
{
|
||||||
if (top != null && xObject.Type == XObjectType.Image)
|
if (top != null && xObject.Type == XObjectType.Image)
|
||||||
|
|||||||
@@ -19,11 +19,11 @@
|
|||||||
{
|
{
|
||||||
private readonly IPdfTokenScanner pdfScanner;
|
private readonly IPdfTokenScanner pdfScanner;
|
||||||
private readonly IResourceStore resourceStore;
|
private readonly IResourceStore resourceStore;
|
||||||
private readonly IFilterProvider filterProvider;
|
private readonly ILookupFilterProvider filterProvider;
|
||||||
private readonly IPageContentParser pageContentParser;
|
private readonly IPageContentParser pageContentParser;
|
||||||
private readonly ILog log;
|
private readonly ILog log;
|
||||||
|
|
||||||
public PageFactory(IPdfTokenScanner pdfScanner, IResourceStore resourceStore, IFilterProvider filterProvider,
|
public PageFactory(IPdfTokenScanner pdfScanner, IResourceStore resourceStore, ILookupFilterProvider filterProvider,
|
||||||
IPageContentParser pageContentParser,
|
IPageContentParser pageContentParser,
|
||||||
ILog log)
|
ILog log)
|
||||||
{
|
{
|
||||||
@@ -122,7 +122,7 @@
|
|||||||
throw new InvalidOperationException($"Could not find the contents for object {obj}.");
|
throw new InvalidOperationException($"Could not find the contents for object {obj}.");
|
||||||
}
|
}
|
||||||
|
|
||||||
bytes.AddRange(contentStream.Decode(filterProvider));
|
bytes.AddRange(contentStream.Decode(filterProvider, pdfScanner));
|
||||||
|
|
||||||
if (i < array.Data.Count - 1)
|
if (i < array.Data.Count - 1)
|
||||||
{
|
{
|
||||||
@@ -141,7 +141,7 @@
|
|||||||
throw new InvalidOperationException("Failed to parse the content for the page: " + number);
|
throw new InvalidOperationException("Failed to parse the content for the page: " + number);
|
||||||
}
|
}
|
||||||
|
|
||||||
var bytes = contentStream.Decode(filterProvider);
|
var bytes = contentStream.Decode(filterProvider, pdfScanner);
|
||||||
|
|
||||||
content = GetContent(number, bytes, cropBox, userSpaceUnit, rotation, clipPaths, mediaBox);
|
content = GetContent(number, bytes, cropBox, userSpaceUnit, rotation, clipPaths, mediaBox);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -83,7 +83,7 @@
|
|||||||
private static PdfDocument OpenDocument(IInputBytes inputBytes, ISeekableTokenScanner scanner, ILog log, bool isLenientParsing,
|
private static PdfDocument OpenDocument(IInputBytes inputBytes, ISeekableTokenScanner scanner, ILog log, bool isLenientParsing,
|
||||||
IReadOnlyList<string> passwords, bool clipPaths)
|
IReadOnlyList<string> passwords, bool clipPaths)
|
||||||
{
|
{
|
||||||
var filterProvider = DefaultFilterProvider.Instance;
|
var filterProvider = new FilterProviderWithLookup(DefaultFilterProvider.Instance);
|
||||||
|
|
||||||
CrossReferenceTable crossReferenceTable = null;
|
CrossReferenceTable crossReferenceTable = null;
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
[NotNull]
|
[NotNull]
|
||||||
private readonly IPdfTokenScanner pdfScanner;
|
private readonly IPdfTokenScanner pdfScanner;
|
||||||
|
|
||||||
private readonly IFilterProvider filterProvider;
|
private readonly ILookupFilterProvider filterProvider;
|
||||||
private readonly BookmarksProvider bookmarksProvider;
|
private readonly BookmarksProvider bookmarksProvider;
|
||||||
|
|
||||||
[NotNull]
|
[NotNull]
|
||||||
@@ -92,7 +92,7 @@
|
|||||||
DocumentInformation information,
|
DocumentInformation information,
|
||||||
EncryptionDictionary encryptionDictionary,
|
EncryptionDictionary encryptionDictionary,
|
||||||
IPdfTokenScanner pdfScanner,
|
IPdfTokenScanner pdfScanner,
|
||||||
IFilterProvider filterProvider,
|
ILookupFilterProvider filterProvider,
|
||||||
AcroFormFactory acroFormFactory,
|
AcroFormFactory acroFormFactory,
|
||||||
BookmarksProvider bookmarksProvider,
|
BookmarksProvider bookmarksProvider,
|
||||||
bool clipPaths)
|
bool clipPaths)
|
||||||
@@ -202,7 +202,7 @@
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
metadata = new XmpMetadata(xmpStreamToken, filterProvider);
|
metadata = new XmpMetadata(xmpStreamToken, filterProvider, pdfScanner);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -219,7 +219,11 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
bookmarks = bookmarksProvider.GetBookmarks(Structure.Catalog);
|
bookmarks = bookmarksProvider.GetBookmarks(Structure.Catalog);
|
||||||
if (bookmarks != null) return true;
|
if (bookmarks != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -62,5 +62,18 @@
|
|||||||
|
|
||||||
return transform;
|
return transform;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static IReadOnlyList<byte> Decode(this StreamToken stream, ILookupFilterProvider filterProvider, IPdfTokenScanner scanner)
|
||||||
|
{
|
||||||
|
var filters = filterProvider.GetFilters(stream.StreamDictionary, scanner);
|
||||||
|
|
||||||
|
var transform = stream.Data;
|
||||||
|
for (var i = 0; i < filters.Count; i++)
|
||||||
|
{
|
||||||
|
transform = filters[i].Decode(transform, stream.StreamDictionary, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return transform;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,12 +25,12 @@
|
|||||||
{
|
{
|
||||||
private readonly ILog log;
|
private readonly ILog log;
|
||||||
private readonly IPdfTokenScanner pdfScanner;
|
private readonly IPdfTokenScanner pdfScanner;
|
||||||
private readonly IFilterProvider filterProvider;
|
private readonly ILookupFilterProvider filterProvider;
|
||||||
private readonly IEncodingReader encodingReader;
|
private readonly IEncodingReader encodingReader;
|
||||||
private readonly ISystemFontFinder systemFontFinder;
|
private readonly ISystemFontFinder systemFontFinder;
|
||||||
private readonly IFontHandler type1FontHandler;
|
private readonly IFontHandler type1FontHandler;
|
||||||
|
|
||||||
public TrueTypeFontHandler(ILog log, IPdfTokenScanner pdfScanner, IFilterProvider filterProvider,
|
public TrueTypeFontHandler(ILog log, IPdfTokenScanner pdfScanner, ILookupFilterProvider filterProvider,
|
||||||
IEncodingReader encodingReader,
|
IEncodingReader encodingReader,
|
||||||
ISystemFontFinder systemFontFinder,
|
ISystemFontFinder systemFontFinder,
|
||||||
IFontHandler type1FontHandler)
|
IFontHandler type1FontHandler)
|
||||||
@@ -109,7 +109,7 @@
|
|||||||
{
|
{
|
||||||
var toUnicode = DirectObjectFinder.Get<StreamToken>(toUnicodeObj, pdfScanner);
|
var toUnicode = DirectObjectFinder.Get<StreamToken>(toUnicodeObj, pdfScanner);
|
||||||
|
|
||||||
var decodedUnicodeCMap = toUnicode.Decode(filterProvider);
|
var decodedUnicodeCMap = toUnicode.Decode(filterProvider, pdfScanner);
|
||||||
|
|
||||||
if (decodedUnicodeCMap != null)
|
if (decodedUnicodeCMap != null)
|
||||||
{
|
{
|
||||||
@@ -173,7 +173,7 @@
|
|||||||
{
|
{
|
||||||
var fontFileStream = DirectObjectFinder.Get<StreamToken>(descriptor.FontFile.ObjectKey, pdfScanner);
|
var fontFileStream = DirectObjectFinder.Get<StreamToken>(descriptor.FontFile.ObjectKey, pdfScanner);
|
||||||
|
|
||||||
var fontFile = fontFileStream.Decode(filterProvider);
|
var fontFile = fontFileStream.Decode(filterProvider, pdfScanner);
|
||||||
|
|
||||||
if (descriptor.FontFile.FileType == DescriptorFontFile.FontFileType.FromSubtype)
|
if (descriptor.FontFile.FileType == DescriptorFontFile.FontFileType.FromSubtype)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -16,10 +16,10 @@
|
|||||||
internal class Type0FontHandler : IFontHandler
|
internal class Type0FontHandler : IFontHandler
|
||||||
{
|
{
|
||||||
private readonly CidFontFactory cidFontFactory;
|
private readonly CidFontFactory cidFontFactory;
|
||||||
private readonly IFilterProvider filterProvider;
|
private readonly ILookupFilterProvider filterProvider;
|
||||||
private readonly IPdfTokenScanner scanner;
|
private readonly IPdfTokenScanner scanner;
|
||||||
|
|
||||||
public Type0FontHandler(CidFontFactory cidFontFactory, IFilterProvider filterProvider,
|
public Type0FontHandler(CidFontFactory cidFontFactory, ILookupFilterProvider filterProvider,
|
||||||
IPdfTokenScanner scanner)
|
IPdfTokenScanner scanner)
|
||||||
{
|
{
|
||||||
this.cidFontFactory = cidFontFactory;
|
this.cidFontFactory = cidFontFactory;
|
||||||
@@ -66,7 +66,7 @@
|
|||||||
|
|
||||||
if (DirectObjectFinder.TryGet<StreamToken>(toUnicodeValue, scanner, out var toUnicodeStream))
|
if (DirectObjectFinder.TryGet<StreamToken>(toUnicodeValue, scanner, out var toUnicodeStream))
|
||||||
{
|
{
|
||||||
var decodedUnicodeCMap = toUnicodeStream?.Decode(filterProvider);
|
var decodedUnicodeCMap = toUnicodeStream?.Decode(filterProvider, scanner);
|
||||||
|
|
||||||
if (decodedUnicodeCMap != null)
|
if (decodedUnicodeCMap != null)
|
||||||
{
|
{
|
||||||
@@ -155,7 +155,7 @@
|
|||||||
}
|
}
|
||||||
else if (dictionary.TryGet(NameToken.Encoding, scanner, out StreamToken stream))
|
else if (dictionary.TryGet(NameToken.Encoding, scanner, out StreamToken stream))
|
||||||
{
|
{
|
||||||
var decoded = stream.Decode(filterProvider);
|
var decoded = stream.Decode(filterProvider, scanner);
|
||||||
|
|
||||||
var cmap = CMapCache.Parse(new ByteArrayInputBytes(decoded));
|
var cmap = CMapCache.Parse(new ByteArrayInputBytes(decoded));
|
||||||
|
|
||||||
|
|||||||
@@ -17,10 +17,10 @@
|
|||||||
internal class Type1FontHandler : IFontHandler
|
internal class Type1FontHandler : IFontHandler
|
||||||
{
|
{
|
||||||
private readonly IPdfTokenScanner pdfScanner;
|
private readonly IPdfTokenScanner pdfScanner;
|
||||||
private readonly IFilterProvider filterProvider;
|
private readonly ILookupFilterProvider filterProvider;
|
||||||
private readonly IEncodingReader encodingReader;
|
private readonly IEncodingReader encodingReader;
|
||||||
|
|
||||||
public Type1FontHandler(IPdfTokenScanner pdfScanner, IFilterProvider filterProvider,
|
public Type1FontHandler(IPdfTokenScanner pdfScanner, ILookupFilterProvider filterProvider,
|
||||||
IEncodingReader encodingReader)
|
IEncodingReader encodingReader)
|
||||||
{
|
{
|
||||||
this.pdfScanner = pdfScanner;
|
this.pdfScanner = pdfScanner;
|
||||||
@@ -92,7 +92,7 @@
|
|||||||
{
|
{
|
||||||
var toUnicode = DirectObjectFinder.Get<StreamToken>(toUnicodeObj, pdfScanner);
|
var toUnicode = DirectObjectFinder.Get<StreamToken>(toUnicodeObj, pdfScanner);
|
||||||
|
|
||||||
var decodedUnicodeCMap = toUnicode?.Decode(filterProvider);
|
var decodedUnicodeCMap = toUnicode?.Decode(filterProvider, pdfScanner);
|
||||||
|
|
||||||
if (decodedUnicodeCMap != null)
|
if (decodedUnicodeCMap != null)
|
||||||
{
|
{
|
||||||
@@ -143,7 +143,7 @@
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var bytes = stream.Decode(filterProvider);
|
var bytes = stream.Decode(filterProvider, pdfScanner);
|
||||||
|
|
||||||
// We have a Compact Font Format font rather than an Adobe Type 1 Font.
|
// We have a Compact Font Format font rather than an Adobe Type 1 Font.
|
||||||
if (stream.StreamDictionary.TryGet(NameToken.Subtype, out NameToken subTypeName)
|
if (stream.StreamDictionary.TryGet(NameToken.Subtype, out NameToken subTypeName)
|
||||||
|
|||||||
@@ -13,11 +13,11 @@
|
|||||||
|
|
||||||
internal class Type3FontHandler : IFontHandler
|
internal class Type3FontHandler : IFontHandler
|
||||||
{
|
{
|
||||||
private readonly IFilterProvider filterProvider;
|
private readonly ILookupFilterProvider filterProvider;
|
||||||
private readonly IEncodingReader encodingReader;
|
private readonly IEncodingReader encodingReader;
|
||||||
private readonly IPdfTokenScanner scanner;
|
private readonly IPdfTokenScanner scanner;
|
||||||
|
|
||||||
public Type3FontHandler(IPdfTokenScanner scanner, IFilterProvider filterProvider,
|
public Type3FontHandler(IPdfTokenScanner scanner, ILookupFilterProvider filterProvider,
|
||||||
IEncodingReader encodingReader)
|
IEncodingReader encodingReader)
|
||||||
{
|
{
|
||||||
this.filterProvider = filterProvider;
|
this.filterProvider = filterProvider;
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
{
|
{
|
||||||
var toUnicode = DirectObjectFinder.Get<StreamToken>(toUnicodeObj, scanner);
|
var toUnicode = DirectObjectFinder.Get<StreamToken>(toUnicodeObj, scanner);
|
||||||
|
|
||||||
var decodedUnicodeCMap = toUnicode?.Decode(filterProvider);
|
var decodedUnicodeCMap = toUnicode?.Decode(filterProvider, scanner);
|
||||||
|
|
||||||
if (decodedUnicodeCMap != null)
|
if (decodedUnicodeCMap != null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -17,10 +17,10 @@
|
|||||||
|
|
||||||
internal class CidFontFactory
|
internal class CidFontFactory
|
||||||
{
|
{
|
||||||
private readonly IFilterProvider filterProvider;
|
private readonly ILookupFilterProvider filterProvider;
|
||||||
private readonly IPdfTokenScanner pdfScanner;
|
private readonly IPdfTokenScanner pdfScanner;
|
||||||
|
|
||||||
public CidFontFactory(IPdfTokenScanner pdfScanner, IFilterProvider filterProvider)
|
public CidFontFactory(IPdfTokenScanner pdfScanner, ILookupFilterProvider filterProvider)
|
||||||
{
|
{
|
||||||
this.pdfScanner = pdfScanner;
|
this.pdfScanner = pdfScanner;
|
||||||
this.filterProvider = filterProvider;
|
this.filterProvider = filterProvider;
|
||||||
@@ -109,7 +109,7 @@
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var fontFile = fontFileStream.Decode(filterProvider);
|
var fontFile = fontFileStream.Decode(filterProvider, pdfScanner);
|
||||||
|
|
||||||
switch (descriptor.FontFile.FileType)
|
switch (descriptor.FontFile.FileType)
|
||||||
{
|
{
|
||||||
@@ -134,14 +134,14 @@
|
|||||||
if (subtypeName == NameToken.CidFontType0C
|
if (subtypeName == NameToken.CidFontType0C
|
||||||
|| subtypeName == NameToken.Type1C)
|
|| subtypeName == NameToken.Type1C)
|
||||||
{
|
{
|
||||||
var bytes = str.Decode(filterProvider);
|
var bytes = str.Decode(filterProvider, pdfScanner);
|
||||||
var font = CompactFontFormatParser.Parse(new CompactFontFormatData(bytes));
|
var font = CompactFontFormatParser.Parse(new CompactFontFormatData(bytes));
|
||||||
return new PdfCidCompactFontFormatFont(font);
|
return new PdfCidCompactFontFormatFont(font);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (subtypeName == NameToken.OpenType)
|
if (subtypeName == NameToken.OpenType)
|
||||||
{
|
{
|
||||||
var bytes = str.Decode(filterProvider);
|
var bytes = str.Decode(filterProvider, pdfScanner);
|
||||||
var ttf = TrueTypeFontParser.Parse(new TrueTypeDataBytes(new ByteArrayInputBytes(bytes)));
|
var ttf = TrueTypeFontParser.Parse(new TrueTypeDataBytes(new ByteArrayInputBytes(bytes)));
|
||||||
return new PdfCidTrueTypeFont(ttf);
|
return new PdfCidTrueTypeFont(ttf);
|
||||||
}
|
}
|
||||||
@@ -301,7 +301,7 @@
|
|||||||
throw new PdfDocumentFormatException($"No stream or name token found for /CIDToGIDMap in dictionary: {dictionary}.");
|
throw new PdfDocumentFormatException($"No stream or name token found for /CIDToGIDMap in dictionary: {dictionary}.");
|
||||||
}
|
}
|
||||||
|
|
||||||
var bytes = stream.Decode(filterProvider);
|
var bytes = stream.Decode(filterProvider, pdfScanner);
|
||||||
|
|
||||||
return new CharacterIdentifierToGlyphIndexMap(bytes);
|
return new CharacterIdentifierToGlyphIndexMap(bytes);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
private readonly IInputBytes inputBytes;
|
private readonly IInputBytes inputBytes;
|
||||||
private readonly IObjectLocationProvider objectLocationProvider;
|
private readonly IObjectLocationProvider objectLocationProvider;
|
||||||
private readonly IFilterProvider filterProvider;
|
private readonly ILookupFilterProvider filterProvider;
|
||||||
private readonly CoreTokenScanner coreTokenScanner;
|
private readonly CoreTokenScanner coreTokenScanner;
|
||||||
|
|
||||||
private IEncryptionHandler encryptionHandler;
|
private IEncryptionHandler encryptionHandler;
|
||||||
@@ -50,7 +50,7 @@
|
|||||||
|
|
||||||
public long Length => coreTokenScanner.Length;
|
public long Length => coreTokenScanner.Length;
|
||||||
|
|
||||||
public PdfTokenScanner(IInputBytes inputBytes, IObjectLocationProvider objectLocationProvider, IFilterProvider filterProvider,
|
public PdfTokenScanner(IInputBytes inputBytes, IObjectLocationProvider objectLocationProvider, ILookupFilterProvider filterProvider,
|
||||||
IEncryptionHandler encryptionHandler)
|
IEncryptionHandler encryptionHandler)
|
||||||
{
|
{
|
||||||
this.inputBytes = inputBytes;
|
this.inputBytes = inputBytes;
|
||||||
@@ -794,7 +794,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Read the N integers
|
// Read the N integers
|
||||||
var bytes = new ByteArrayInputBytes(stream.Decode(filterProvider));
|
var bytes = new ByteArrayInputBytes(stream.Decode(filterProvider, this));
|
||||||
|
|
||||||
var scanner = new CoreTokenScanner(bytes);
|
var scanner = new CoreTokenScanner(bytes);
|
||||||
|
|
||||||
|
|||||||
@@ -71,7 +71,7 @@
|
|||||||
DictionaryToken imageDictionary,
|
DictionaryToken imageDictionary,
|
||||||
IPdfTokenScanner scanner,
|
IPdfTokenScanner scanner,
|
||||||
IResourceStore resourceStore,
|
IResourceStore resourceStore,
|
||||||
IFilterProvider filterProvider,
|
ILookupFilterProvider filterProvider,
|
||||||
bool cannotRecurse = false)
|
bool cannotRecurse = false)
|
||||||
{
|
{
|
||||||
if (!colorSpace.HasValue)
|
if (!colorSpace.HasValue)
|
||||||
@@ -179,7 +179,7 @@
|
|||||||
}
|
}
|
||||||
else if (DirectObjectFinder.TryGet(fourth, scanner, out StreamToken tableStreamToken))
|
else if (DirectObjectFinder.TryGet(fourth, scanner, out StreamToken tableStreamToken))
|
||||||
{
|
{
|
||||||
tableBytes = tableStreamToken.Decode(filterProvider);
|
tableBytes = tableStreamToken.Decode(filterProvider, scanner);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
using Graphics;
|
using Graphics;
|
||||||
using Graphics.Colors;
|
using Graphics.Colors;
|
||||||
using Graphics.Core;
|
using Graphics.Core;
|
||||||
using Parser.Parts;
|
|
||||||
using Tokenization.Scanner;
|
using Tokenization.Scanner;
|
||||||
using Tokens;
|
using Tokens;
|
||||||
using Util;
|
using Util;
|
||||||
@@ -17,7 +16,7 @@
|
|||||||
internal static class XObjectFactory
|
internal static class XObjectFactory
|
||||||
{
|
{
|
||||||
public static XObjectImage ReadImage(XObjectContentRecord xObject, IPdfTokenScanner pdfScanner,
|
public static XObjectImage ReadImage(XObjectContentRecord xObject, IPdfTokenScanner pdfScanner,
|
||||||
IFilterProvider filterProvider,
|
ILookupFilterProvider filterProvider,
|
||||||
IResourceStore resourceStore)
|
IResourceStore resourceStore)
|
||||||
{
|
{
|
||||||
if (xObject == null)
|
if (xObject == null)
|
||||||
@@ -89,7 +88,7 @@
|
|||||||
var supportsFilters = filterDictionary != null;
|
var supportsFilters = filterDictionary != null;
|
||||||
if (filterDictionary != null)
|
if (filterDictionary != null)
|
||||||
{
|
{
|
||||||
var filters = filterProvider.GetFilters(filterDictionary);
|
var filters = filterProvider.GetFilters(filterDictionary, pdfScanner);
|
||||||
foreach (var filter in filters)
|
foreach (var filter in filters)
|
||||||
{
|
{
|
||||||
if (!filter.IsSupported)
|
if (!filter.IsSupported)
|
||||||
@@ -100,7 +99,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var decodedBytes = supportsFilters ? new Lazy<IReadOnlyList<byte>>(() => xObject.Stream.Decode(filterProvider))
|
var decodedBytes = supportsFilters ? new Lazy<IReadOnlyList<byte>>(() => xObject.Stream.Decode(filterProvider, pdfScanner))
|
||||||
: null;
|
: null;
|
||||||
|
|
||||||
var decode = EmptyArray<decimal>.Instance;
|
var decode = EmptyArray<decimal>.Instance;
|
||||||
|
|||||||
Reference in New Issue
Block a user