unipdf/pdf/model/appender_test.go

365 lines
7.0 KiB
Go
Raw Normal View History

2018-12-11 16:06:34 +03:00
/*
* This file is subject to the terms and conditions defined in
* file 'LICENSE.md', which is part of this source code package.
*/
package model
import (
"os"
"path/filepath"
"testing"
"github.com/unidoc/unidoc/common"
"github.com/unidoc/unidoc/pdf/core"
)
// This test file contains multiple tests to generate PDFs from existing Pdf files. The outputs are written into /tmp as files. The files
// themselves need to be observed to check for correctness as we don't have a good way to automatically check
// if every detail is correct.
func init() {
common.SetLogger(common.NewConsoleLogger(common.LogLevelDebug))
}
const testPdfFile1 = "./testdata/minimal.pdf"
const testPdfLoremIpsumFile = "./testdata/lorem.pdf"
const testPdf3pages = "./testdata/pages3.pdf"
const imgPdfFile1 = "./testdata/img1-1.pdf"
const imgPdfFile2 = "./testdata/img1-2.pdf"
// source http://foersom.com/net/HowTo/data/OoPdfFormExample.pdf
const testPdfAcroFormFile1 = "./testdata/OoPdfFormExample.pdf"
func tempFile(name string) string {
return filepath.Join(os.TempDir(), name)
}
func TestAppenderAddPage(t *testing.T) {
f1, err := os.Open(testPdfLoremIpsumFile)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
defer f1.Close()
pdf1, err := NewPdfReader(f1)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
f2, err := os.Open(testPdfFile1)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
defer f2.Close()
pdf2, err := NewPdfReader(f2)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
appender, err := NewPdfAppender(pdf1)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
appender.AddPages(pdf1.PageList...)
appender.AddPages(pdf2.PageList...)
appender.AddPages(pdf2.PageList...)
err = appender.WriteToFile(tempFile("appender_add_page_1.pdf"))
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
}
func TestAppenderAddPage2(t *testing.T) {
f1, err := os.Open(testPdfLoremIpsumFile)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
defer f1.Close()
pdf1, err := NewPdfReader(f1)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
f2, err := os.Open(testPdfAcroFormFile1)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
defer f2.Close()
pdf2, err := NewPdfReader(f2)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
appender, err := NewPdfAppender(pdf1)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
appender.AddPages(pdf2.PageList...)
appender.ReplaceAcroForm(pdf2.AcroForm)
err = appender.WriteToFile(tempFile("appender_add_page_2.pdf"))
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
}
func TestAppenderRemovePage(t *testing.T) {
f1, err := os.Open(testPdf3pages)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
defer f1.Close()
pdf1, err := NewPdfReader(f1)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
appender, err := NewPdfAppender(pdf1)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
appender.RemovePage(1)
appender.RemovePage(2)
err = appender.WriteToFile(tempFile("appender_remove_page_1.pdf"))
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
}
func TestAppenderReplacePage(t *testing.T) {
f1, err := os.Open(testPdf3pages)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
defer f1.Close()
pdf1, err := NewPdfReader(f1)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
f2, err := os.Open(testPdfFile1)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
defer f2.Close()
pdf2, err := NewPdfReader(f2)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
appender, err := NewPdfAppender(pdf1)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
appender.ReplacePage(1, pdf1.PageList[1])
appender.ReplacePage(3, pdf2.PageList[0])
err = appender.WriteToFile(tempFile("appender_replace_page_1.pdf"))
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
}
func TestAppenderAddAnnotation(t *testing.T) {
f1, err := os.Open(testPdf3pages)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
defer f1.Close()
pdf1, err := NewPdfReader(f1)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
appender, err := NewPdfAppender(pdf1)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
page := pdf1.PageList[0]
annotation := NewPdfAnnotationSquare()
rect := PdfRectangle{Ury: 250.0, Urx: 150.0, Lly: 50.0, Llx: 50.0}
annotation.Rect = rect.ToPdfObject()
annotation.IC = core.MakeArrayFromFloats([]float64{4.0, 0.0, 0.3})
annotation.CA = core.MakeFloat(0.5)
page.Annotations = append(page.Annotations, annotation.PdfAnnotation)
appender.ReplacePage(1, page)
err = appender.WriteToFile(tempFile("appender_add_annotation_1.pdf"))
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
}
func TestAppenderMergePage(t *testing.T) {
f1, err := os.Open(testPdf3pages)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
defer f1.Close()
pdf1, err := NewPdfReader(f1)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
f2, err := os.Open(testPdfFile1)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
defer f2.Close()
pdf2, err := NewPdfReader(f2)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
appender, err := NewPdfAppender(pdf1)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
err = appender.MergePageWith(1, pdf2.PageList[0])
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
err = appender.WriteToFile(tempFile("appender_merge_page_1.pdf"))
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
}
func TestAppenderMergePage2(t *testing.T) {
f1, err := os.Open(imgPdfFile1)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
defer f1.Close()
pdf1, err := NewPdfReader(f1)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
f2, err := os.Open(imgPdfFile2)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
defer f2.Close()
pdf2, err := NewPdfReader(f2)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
appender, err := NewPdfAppender(pdf1)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
err = appender.MergePageWith(1, pdf2.PageList[0])
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
appender.AddPages(pdf2.PageList...)
err = appender.WriteToFile(tempFile("appender_merge_page_2.pdf"))
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
}
func TestAppenderMergePage3(t *testing.T) {
f1, err := os.Open(testPdfFile1)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
defer f1.Close()
pdf1, err := NewPdfReader(f1)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
f2, err := os.Open(testPdfLoremIpsumFile)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
defer f2.Close()
pdf2, err := NewPdfReader(f2)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
appender, err := NewPdfAppender(pdf1)
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
err = appender.MergePageWith(1, pdf2.PageList[0])
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
err = appender.WriteToFile(tempFile("appender_merge_page_3.pdf"))
if err != nil {
t.Errorf("Fail: %v\n", err)
return
}
}