rename to resharper conventions and test 2nd page

renames fields to match the expected conventions for resharper. removes fully qualified names for using statements since resharper marks these as not-required.

adds a check to the pdf merger test to make sure the second page has the expected content. this is not currently valid since we lose the resources node on the pages tree.
This commit is contained in:
Eliot Jones
2020-03-02 17:00:16 +00:00
parent 2193063809
commit c596bef024
2 changed files with 51 additions and 52 deletions
@@ -23,6 +23,10 @@
var page1 = document.GetPage(1); var page1 = document.GetPage(1);
Assert.Equal("Write something inInkscape", page1.Text); Assert.Equal("Write something inInkscape", page1.Text);
var page2 = document.GetPage(2);
Assert.Equal("I am a simple pdf.", page2.Text);
} }
} }
} }
+47 -52
View File
@@ -15,9 +15,9 @@
using Parser.Parts; using Parser.Parts;
using Tokenization.Scanner; using Tokenization.Scanner;
using Tokens; using Tokens;
using UglyToad.PdfPig.Exceptions; using Exceptions;
using UglyToad.PdfPig.Graphics.Operations; using Graphics.Operations;
using UglyToad.PdfPig.Writer.Fonts; using Fonts;
/// <summary> /// <summary>
/// Merges PDF documents into each other. /// Merges PDF documents into each other.
@@ -79,6 +79,7 @@
CrossReferenceTable crossReference = null; CrossReferenceTable crossReference = null;
// ReSharper disable once AccessToModifiedClosure
var locationProvider = new ObjectLocationProvider(() => crossReference, bruteForceSearcher); var locationProvider = new ObjectLocationProvider(() => crossReference, bruteForceSearcher);
var pdfScanner = new PdfTokenScanner(inputBytes, locationProvider, FilterProvider, NoOpEncryptionHandler.Instance); var pdfScanner = new PdfTokenScanner(inputBytes, locationProvider, FilterProvider, NoOpEncryptionHandler.Instance);
@@ -130,47 +131,44 @@
private class DocumentMerger private class DocumentMerger
{ {
private const decimal DEFAULT_VERSION = 1.2m; private const decimal DefaultVersion = 1.2m;
private readonly BuilderContext context = new BuilderContext();
private readonly List<IndirectReferenceToken> documentPages = new List<IndirectReferenceToken>();
private readonly IndirectReferenceToken rootPagesIndirectReference;
private MemoryStream Memory = new MemoryStream(); private decimal currentVersion = DefaultVersion;
private MemoryStream memory = new MemoryStream();
private readonly BuilderContext Context = new BuilderContext();
private readonly List<IndirectReferenceToken> DocumentPages = new List<IndirectReferenceToken>();
private IndirectReferenceToken RootPagesIndirectReference;
private decimal CurrentVersion = DEFAULT_VERSION;
public DocumentMerger() public DocumentMerger()
{ {
var reserved = Context.ReserveNumber(); var reserved = context.ReserveNumber();
RootPagesIndirectReference = new IndirectReferenceToken(new IndirectReference(reserved, 0)); rootPagesIndirectReference = new IndirectReferenceToken(new IndirectReference(reserved, 0));
WriteHeaderToStream(); WriteHeaderToStream();
} }
public void AppendDocument(Catalog documentCatalog, decimal version, IPdfTokenScanner tokenScanner) public void AppendDocument(Catalog documentCatalog, decimal version, IPdfTokenScanner tokenScanner)
{ {
if (Memory == null) if (memory == null)
{ {
throw new ObjectDisposedException("Merger closed already"); throw new ObjectDisposedException("Merger closed already");
} }
CurrentVersion = Math.Max(version, CurrentVersion); currentVersion = Math.Max(version, currentVersion);
var pagesReference = CopyPagesTree(documentCatalog.PageTree, RootPagesIndirectReference, tokenScanner); var pagesReference = CopyPagesTree(documentCatalog.PageTree, rootPagesIndirectReference, tokenScanner);
DocumentPages.Add(new IndirectReferenceToken(pagesReference.Number)); documentPages.Add(new IndirectReferenceToken(pagesReference.Number));
} }
public byte[] Build() public byte[] Build()
{ {
if (Memory == null) if (memory == null)
{ {
throw new ObjectDisposedException("Merger closed already"); throw new ObjectDisposedException("Merger closed already");
} }
if (DocumentPages.Count < 1) if (documentPages.Count < 1)
{ {
throw new PdfDocumentFormatException("Empty document"); throw new PdfDocumentFormatException("Empty document");
} }
@@ -178,11 +176,11 @@
var pagesDictionary = new DictionaryToken(new Dictionary<NameToken, IToken> var pagesDictionary = new DictionaryToken(new Dictionary<NameToken, IToken>
{ {
{ NameToken.Type, NameToken.Pages }, { NameToken.Type, NameToken.Pages },
{ NameToken.Kids, new ArrayToken(DocumentPages) }, { NameToken.Kids, new ArrayToken(documentPages) },
{ NameToken.Count, new NumericToken(DocumentPages.Count) } { NameToken.Count, new NumericToken(documentPages.Count) }
}); });
var pagesRef = Context.WriteObject(Memory, pagesDictionary, (int)RootPagesIndirectReference.Data.ObjectNumber); var pagesRef = context.WriteObject(memory, pagesDictionary, (int)rootPagesIndirectReference.Data.ObjectNumber);
var catalog = new DictionaryToken(new Dictionary<NameToken, IToken> var catalog = new DictionaryToken(new Dictionary<NameToken, IToken>
{ {
@@ -190,17 +188,17 @@
{ NameToken.Pages, new IndirectReferenceToken(pagesRef.Number) } { NameToken.Pages, new IndirectReferenceToken(pagesRef.Number) }
}); });
var catalogRef = Context.WriteObject(Memory, catalog); var catalogRef = context.WriteObject(memory, catalog);
TokenWriter.WriteCrossReferenceTable(Context.ObjectOffsets, catalogRef, Memory, null); TokenWriter.WriteCrossReferenceTable(context.ObjectOffsets, catalogRef, memory, null);
if (CurrentVersion != DEFAULT_VERSION) if (currentVersion != DefaultVersion)
{ {
Memory.Seek(0, SeekOrigin.Begin); memory.Seek(0, SeekOrigin.Begin);
WriteHeaderToStream(); WriteHeaderToStream();
} }
var bytes = Memory.ToArray(); var bytes = memory.ToArray();
Close(); Close();
@@ -209,18 +207,15 @@
public void Close() public void Close()
{ {
if (Memory == null) memory?.Dispose();
return; memory = null;
Memory.Dispose();
Memory = null;
} }
private ObjectToken CopyPagesTree(PageTreeNode treeNode, IndirectReferenceToken treeParentReference, IPdfTokenScanner tokenScanner) private ObjectToken CopyPagesTree(PageTreeNode treeNode, IndirectReferenceToken treeParentReference, IPdfTokenScanner tokenScanner)
{ {
Debug.Assert(!treeNode.IsPage); Debug.Assert(!treeNode.IsPage);
var currentNodeReserved = Context.ReserveNumber(); var currentNodeReserved = context.ReserveNumber();
var currentNodeReference = new IndirectReferenceToken(new IndirectReference(currentNodeReserved, 0)); var currentNodeReference = new IndirectReferenceToken(new IndirectReference(currentNodeReserved, 0));
var pageReferences = new List<IndirectReferenceToken>(); var pageReferences = new List<IndirectReferenceToken>();
@@ -228,10 +223,14 @@
{ {
ObjectToken newEntry; ObjectToken newEntry;
if (!pageNode.IsPage) if (!pageNode.IsPage)
{
newEntry = CopyPagesTree(pageNode, currentNodeReference, tokenScanner); newEntry = CopyPagesTree(pageNode, currentNodeReference, tokenScanner);
}
else else
{
newEntry = CopyPageNode(pageNode, currentNodeReference, tokenScanner); newEntry = CopyPageNode(pageNode, currentNodeReference, tokenScanner);
}
pageReferences.Add(new IndirectReferenceToken(newEntry.Number)); pageReferences.Add(new IndirectReferenceToken(newEntry.Number));
} }
@@ -243,7 +242,7 @@
{ NameToken.Parent, treeParentReference } { NameToken.Parent, treeParentReference }
}); });
return Context.WriteObject(Memory, pagesDictionary, currentNodeReserved); return context.WriteObject(memory, pagesDictionary, currentNodeReserved);
} }
private ObjectToken CopyPageNode(PageTreeNode pageNode, IndirectReferenceToken parentPagesObject, IPdfTokenScanner tokenScanner) private ObjectToken CopyPageNode(PageTreeNode pageNode, IndirectReferenceToken parentPagesObject, IPdfTokenScanner tokenScanner)
@@ -269,7 +268,7 @@
pageDictionary.Add(NameToken.Create(name), CopyToken(token, tokenScanner)); pageDictionary.Add(NameToken.Create(name), CopyToken(token, tokenScanner));
} }
return Context.WriteObject(Memory, new DictionaryToken(pageDictionary)); return context.WriteObject(memory, new DictionaryToken(pageDictionary));
} }
/// <summary> /// <summary>
@@ -310,7 +309,7 @@
Debug.Assert(!(tokenObject is IndirectReferenceToken)); Debug.Assert(!(tokenObject is IndirectReferenceToken));
var newToken = CopyToken(tokenObject, tokenScanner); var newToken = CopyToken(tokenObject, tokenScanner);
var objToken = Context.WriteObject(Memory, newToken); var objToken = context.WriteObject(memory, newToken);
return new IndirectReferenceToken(objToken.Number); return new IndirectReferenceToken(objToken.Number);
} }
else if (tokenToCopy is StreamToken streamToken) else if (tokenToCopy is StreamToken streamToken)
@@ -327,25 +326,21 @@
private void WriteHeaderToStream() private void WriteHeaderToStream()
{ {
WriteString($"%PDF-{CurrentVersion:0.0}", Memory); WriteString($"%PDF-{currentVersion:0.0}", memory);
Memory.WriteText("%"); memory.WriteText("%");
Memory.WriteByte(169); memory.WriteByte(169);
Memory.WriteByte(205); memory.WriteByte(205);
Memory.WriteByte(196); memory.WriteByte(196);
Memory.WriteByte(210); memory.WriteByte(210);
Memory.WriteNewLine(); memory.WriteNewLine();
} }
// Note: This method is copied from UglyToad.PdfPig.Writer.PdfDocumentBuilder private static void WriteString(string text, Stream stream)
private static void WriteString(string text, MemoryStream stream, bool appendBreak = true)
{ {
var bytes = OtherEncodings.StringAsLatin1Bytes(text); var bytes = OtherEncodings.StringAsLatin1Bytes(text);
stream.Write(bytes, 0, bytes.Length); stream.Write(bytes, 0, bytes.Length);
if (appendBreak) stream.WriteNewLine();
{
stream.WriteNewLine();
}
} }
} }
} }