Skip to content

Commit 80aa62c

Browse files
committed
Fix #71, #72
1 parent b2c24ae commit 80aa62c

File tree

8 files changed

+53
-37
lines changed

8 files changed

+53
-37
lines changed

README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,18 @@ Even if you want to dive right into pdfcpu backend integration it is highly reco
6969
## Status
7070

7171
[Version: 0.1.22](https://github.com/hhrutter/pdfcpu/releases/tag/v0.1.22)
72+
7273
* Support for `go mod`
7374
* Command completion
7475
* `pages insert` inserts empty pages before all selected pages
7576
* `pages remove` removes all selected pages
7677
* Bug fixes #64, #65, #68, #69
7778

79+
## Reminder
80+
81+
Always make sure your work is based on the latest commit!<br>
82+
pdfcpu is still *Alpha* - bugfixes are committed on the fly and will be mentioned on the next release notes.<br>
83+
7884
## Demo Screencast
7985

8086
(using older version with a smaller command set)
@@ -112,7 +118,7 @@ pdfcpu ve
112118
* Feature requests - always welcome!
113119
* Bug fixes - always welcome!
114120
* PRs - also welcome, although I can't promise a merge-in right now.
115-
* pdfcpu is stable but still alpha and occasionally undergoing heavy changes.
121+
* pdfcpu is stable but still *Alpha* and occasionally undergoing heavy changes.
116122

117123
### How
118124

pkg/api/api.go

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,6 @@ func writeSinglePagePDF(ctx *pdf.Context, pageNr int, dirOut string) error {
207207
ctx.ResetWriteContext()
208208

209209
w := ctx.Write
210-
w.Command = "ExtractPages"
211210
w.SelectedPages[pageNr] = true
212211
w.DirName = dirOut + "/"
213212
w.FileName = singlePageFileName(ctx, pageNr)
@@ -330,7 +329,6 @@ func pageRangeFileName(ctx *pdf.Context, from, thru int) string {
330329
func writeSpan(ctx *pdf.Context, from, thru int, dirOut string) error {
331330
ctx.ResetWriteContext()
332331
w := ctx.Write
333-
w.Command = "Split"
334332
w.SelectedPages = selectedPageRange(from, thru)
335333
w.DirName = dirOut + "/"
336334
w.FileName = pageRangeFileName(ctx, from, thru)
@@ -457,8 +455,6 @@ func Merge(cmd *Command) ([]string, error) {
457455
return nil, err
458456
}
459457

460-
ctxDest.Write.Command = "Merge"
461-
462458
dirName, fileName := filepath.Split(fileOut)
463459
ctxDest.Write.DirName = dirName
464460
ctxDest.Write.FileName = fileName
@@ -995,7 +991,6 @@ func Trim(cmd *Command) ([]string, error) {
995991
return nil, err
996992
}
997993

998-
ctx.Write.Command = "Trim"
999994
ctx.Write.SelectedPages = pages
1000995

1001996
dirName, fileName := filepath.Split(fileOut)
@@ -1363,7 +1358,6 @@ func ImportImages(cmd *Command) ([]string, error) {
13631358
return nil, err
13641359
}
13651360

1366-
ctx.Write.Command = "Import"
13671361
dirName, fileName := filepath.Split(fileOut)
13681362
ctx.Write.DirName = dirName
13691363
ctx.Write.FileName = fileName
@@ -1577,7 +1571,6 @@ func NUp(cmd *Command) ([]string, error) {
15771571
return nil, err
15781572
}
15791573

1580-
ctx.Write.Command = "N-Up"
15811574
dirName, fileName := filepath.Split(fileOut)
15821575
ctx.Write.DirName = dirName
15831576
ctx.Write.FileName = fileName

pkg/api/process_test.go

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ func ExampleReadContext() {
6666
// This allows to run pdf as a backend to an http server for on the fly pdf processing.
6767

6868
config := pdf.NewDefaultConfiguration()
69+
config.Cmd = pdf.OPTIMIZE
70+
6971
fileIn := filepath.Join(inDir, "CenterOfWhy.pdf")
7072
fileOut := filepath.Join(outDir, "test.pdf")
7173

@@ -125,15 +127,17 @@ func ExampleReadContext() {
125127

126128
}
127129

128-
func TestReadSeekerAndWriter(t *testing.T) {
130+
func TestOptimizeUsingReadSeekerAndWriter(t *testing.T) {
129131

130132
config := pdf.NewDefaultConfiguration()
133+
config.Cmd = pdf.OPTIMIZE
134+
131135
fileIn := filepath.Join(inDir, "CenterOfWhy.pdf")
132136
fileOut := filepath.Join(outDir, "test.pdf")
133137

134138
f, err := os.Open(fileIn)
135139
if err != nil {
136-
t.Fatalf("TestReadSeekerAndWriter Open: %v\n", err)
140+
t.Fatalf("TestOptimizeUsingReadSeekerAndWriter Open: %v\n", err)
137141
}
138142

139143
defer func() {
@@ -142,27 +146,27 @@ func TestReadSeekerAndWriter(t *testing.T) {
142146

143147
fileInfo, err := f.Stat()
144148
if err != nil {
145-
t.Fatalf("TestReadSeekerAndWriter Stat: %v\n", err)
149+
t.Fatalf("TestOptimizeUsingReadSeekerAndWriter Stat: %v\n", err)
146150
}
147151

148152
ctx, err := ReadContext(f, fileIn, fileInfo.Size(), config)
149153
if err != nil {
150-
t.Fatalf("TestReadSeekerAndWriter Read: %v\n", err)
154+
t.Fatalf("TestOptimizeUsingReadSeekerAndWriter Read: %v\n", err)
151155
}
152156

153157
err = ValidateContext(ctx)
154158
if err != nil {
155-
t.Fatalf("TestReadSeekerAndWriter Validate: %v\n", err)
159+
t.Fatalf("TestOptimizeUsingReadSeekerAndWriter Validate: %v\n", err)
156160
}
157161

158162
err = OptimizeContext(ctx)
159163
if err != nil {
160-
t.Fatalf("TestReadSeekerAndWriter Optimize: %v\n", err)
164+
t.Fatalf("TestOptimizeUsingReadSeekerAndWriter Optimize: %v\n", err)
161165
}
162166

163167
w, err := os.Create(fileOut)
164168
if err != nil {
165-
t.Fatalf("TestReadSeekerAndWriter Create: %v\n", err)
169+
t.Fatalf("TestOptimizeUsingReadSeekerAndWriter Create: %v\n", err)
166170

167171
}
168172

@@ -183,21 +187,23 @@ func TestReadSeekerAndWriter(t *testing.T) {
183187

184188
err = WriteContext(ctx, w)
185189
if err != nil {
186-
t.Fatalf("TestReadSeekerAndWriter Write: %v\n", err)
190+
t.Fatalf("TestOptimizeUsingReadSeekerAndWriter Write: %v\n", err)
187191
}
188192

189193
}
190194

191-
func TestTrimUsingReadSeekerCloser(t *testing.T) {
195+
func TestTrimUsingReadSeekerAndWriter(t *testing.T) {
192196

193197
config := pdf.NewDefaultConfiguration()
198+
config.Cmd = pdf.TRIM
199+
194200
fileIn := filepath.Join(inDir, "pike-stanford.pdf")
195201
fileOut := filepath.Join(outDir, "test.pdf")
196202
pageSelection := []string{"-2"}
197203

198204
f, err := os.Open(fileIn)
199205
if err != nil {
200-
t.Fatalf("TestTrimUsingReadSeekerCloser Open: %v\n", err)
206+
t.Fatalf("TestTrimUsingReadSeekerAndWriter Open: %v\n", err)
201207
}
202208

203209
defer func() {
@@ -206,22 +212,22 @@ func TestTrimUsingReadSeekerCloser(t *testing.T) {
206212

207213
ctx, err := ReadContext(f, "", 0, config)
208214
if err != nil {
209-
t.Fatalf("TestTrimUsingReadSeekerCloser Read: %v\n", err)
215+
t.Fatalf("TestTrimUsingReadSeekerAndWriter Read: %v\n", err)
210216
}
211217

212218
err = ValidateContext(ctx)
213219
if err != nil {
214-
t.Fatalf("TestTrimUsingReadSeekerCloser Validate: %v\n", err)
220+
t.Fatalf("TestTrimUsingReadSeekerAndWriter Validate: %v\n", err)
215221
}
216222

217223
err = OptimizeContext(ctx)
218224
if err != nil {
219-
t.Fatalf("TestTrimUsingReadSeekerCloser Optimize: %v\n", err)
225+
t.Fatalf("TestTrimUsingReadSeekerAndWriter Optimize: %v\n", err)
220226
}
221227

222228
w, err := os.Create(fileOut)
223229
if err != nil {
224-
t.Fatalf("TestTrimUsingReadSeekerCloser Create: %v\n", err)
230+
t.Fatalf("TestTrimUsingReadSeekerAndWriter Create: %v\n", err)
225231

226232
}
227233

@@ -240,22 +246,20 @@ func TestTrimUsingReadSeekerCloser(t *testing.T) {
240246

241247
}()
242248

243-
ctx.Write.Command = "Trim"
244-
245249
pages, err := pagesForPageSelection(ctx.PageCount, pageSelection)
246250
if err != nil {
247-
t.Fatalf("TestTrimUsingReadSeekerCloser pageSelection: %v\n", err)
251+
t.Fatalf("TestTrimUsingReadSeekerAndWriter pageSelection: %v\n", err)
248252
}
249253
ctx.Write.SelectedPages = pages
250254

251255
err = WriteContext(ctx, w)
252256
if err != nil {
253-
t.Fatalf("TestTrimUsingReadSeekerCloser Write: %v\n", err)
257+
t.Fatalf("TestTrimUsingReadSeekerAndWriter Write: %v\n", err)
254258
}
255259

256260
}
257261

258-
func TestMergeUsingReadSeekerCloser(t *testing.T) {
262+
func TestMergeUsingReadSeekerAndWriter(t *testing.T) {
259263

260264
rr := []pdf.ReadSeekerCloser{}
261265

@@ -265,7 +269,7 @@ func TestMergeUsingReadSeekerCloser(t *testing.T) {
265269

266270
f, err := os.Open(fileIn)
267271
if err != nil {
268-
t.Fatalf("TestMergeUsingReadSeekerCloser Open: %v\n", err)
272+
t.Fatalf("TestMergeUsingReadSeekerAndWriter Open: %v\n", err)
269273
}
270274

271275
rr = append(rr, f)
@@ -278,17 +282,18 @@ func TestMergeUsingReadSeekerCloser(t *testing.T) {
278282
}()
279283

280284
config := pdf.NewDefaultConfiguration()
285+
config.Cmd = pdf.MERGE
281286

282287
ctx, err := MergeContexts(rr, config)
283288
if err != nil {
284-
t.Fatalf("TestMergeUsingReadSeekerCloser Open: %v\n", err)
289+
t.Fatalf("TestMergeUsingReadSeekerAndWriter Open: %v\n", err)
285290
}
286291

287292
fileOut := filepath.Join(outDir, "test.pdf")
288293

289294
w, err := os.Create(fileOut)
290295
if err != nil {
291-
t.Fatalf("TestMergeUsingReadSeekerCloser create output file: %v\n", err)
296+
t.Fatalf("TestMergeUsingReadSeekerAndWriter create output file: %v\n", err)
292297
}
293298

294299
defer func() {
@@ -308,7 +313,7 @@ func TestMergeUsingReadSeekerCloser(t *testing.T) {
308313

309314
err = WriteContext(ctx, w)
310315
if err != nil {
311-
t.Fatalf("TestMergeUsingReadSeekerCloser Write output: %v\n", err)
316+
t.Fatalf("TestMergeUsingReadSeekerAndWriter write output: %v\n", err)
312317
}
313318

314319
}

pkg/pdfcpu/context.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,6 @@ type WriteContext struct {
548548
DirName string
549549
FileName string
550550
FileSize int64
551-
Command string // The processing command in effect.
552551
SelectedPages IntSet // For split, trim and extract.
553552
BinaryTotalSize int64 // total stream data, counts 100% all stream data written.
554553
BinaryImageSize int64 // total image stream data written = Read.BinaryImageSize.

pkg/pdfcpu/dict.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,10 @@ func (d Dict) Len() int {
4040

4141
// Insert adds a new entry to this PDFDict.
4242
func (d Dict) Insert(key string, value Object) (ok bool) {
43-
if _, found := d.Find(key); found {
44-
return false
43+
if o, found := d.Find(key); found {
44+
if o.PDFString() != value.PDFString() {
45+
return false
46+
}
4547
}
4648
d[key] = value
4749
return true

pkg/pdfcpu/read.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -777,7 +777,14 @@ func scanLine(s *bufio.Scanner) (string, error) {
777777
break
778778
}
779779
}
780-
return s.Text(), nil
780+
// Remove comment.
781+
s1 := s.Text()
782+
i := strings.Index(s1, "%")
783+
if i >= 0 {
784+
s1 = s1[:i]
785+
}
786+
787+
return s1, nil
781788
}
782789

783790
func scanTrailer(s *bufio.Scanner, line string) (string, error) {

pkg/pdfcpu/validate/structTree.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,14 @@ func validateObjectReferenceDict(xRefTable *pdf.XRefTable, d pdf.Dict) error {
8888

8989
// Obj: required, indirect reference
9090
ir := d.IndirectRefEntry("Obj")
91-
if ir == nil {
91+
if xRefTable.ValidationMode == pdf.ValidationStrict && ir == nil {
9292
return errors.New("validateObjectReferenceDict: missing required entry \"Obj\"")
9393
}
9494

95+
if ir == nil {
96+
return nil
97+
}
98+
9599
obj, err := xRefTable.Dereference(*ir)
96100
if err != nil {
97101
return err

pkg/pdfcpu/writePages.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ func writeKids(ctx *Context, a Array, pageNr *int) (Array, int, error) {
182182
if ctx.Cmd == REMOVEPAGES {
183183
writePage = !writePage
184184
}
185-
if ctx.Write.SelectedPages[*pageNr] {
185+
if writePage {
186186
log.Write.Printf("writeKids: writing page:%d\n", *pageNr)
187187
err = writePageDict(ctx, ir, d, *pageNr)
188188
kids = append(kids, o)

0 commit comments

Comments
 (0)