mirror of
https://github.com/unidoc/unipdf.git
synced 2025-04-26 13:48:55 +08:00
107 lines
2.4 KiB
Go
107 lines
2.4 KiB
Go
/*
|
|
* 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 (
|
|
"bytes"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// Tests loading annotations from file, writing back out and reloading.
|
|
func TestReadWriteAnnotations(t *testing.T) {
|
|
f, err := os.Open(`testdata/OoPdfFormExample.pdf`)
|
|
require.NoError(t, err)
|
|
defer f.Close()
|
|
|
|
reader, err := NewPdfReaderLazy(f)
|
|
require.NoError(t, err)
|
|
|
|
checkAnnots := func(reader *PdfReader, formExpected bool) {
|
|
// Check Acroform and fields.
|
|
if formExpected {
|
|
require.NotNil(t, reader.AcroForm)
|
|
fields := reader.AcroForm.AllFields()
|
|
require.Len(t, fields, 17)
|
|
require.Nil(t, fields[0].Parent)
|
|
} else {
|
|
require.Nil(t, reader.AcroForm)
|
|
}
|
|
|
|
// Check annotations.
|
|
numPages, err := reader.GetNumPages()
|
|
require.NoError(t, err)
|
|
require.Equal(t, 1, numPages)
|
|
|
|
page, err := reader.GetPage(1)
|
|
require.NoError(t, err)
|
|
|
|
require.NotNil(t, page.Annots)
|
|
annots, err := page.GetAnnotations()
|
|
require.NoError(t, err)
|
|
require.Len(t, annots, 17)
|
|
|
|
wa, ok := annots[0].GetContext().(*PdfAnnotationWidget)
|
|
require.True(t, ok)
|
|
if formExpected {
|
|
require.NotNil(t, wa.parent)
|
|
require.NotNil(t, wa.Parent)
|
|
} else {
|
|
require.Nil(t, wa.parent)
|
|
require.Nil(t, wa.Parent)
|
|
}
|
|
}
|
|
checkAnnots(reader, true)
|
|
|
|
// Write out and reload. With the AcroForm in place.
|
|
{
|
|
w := NewPdfWriter()
|
|
page, err := reader.GetPage(1)
|
|
require.NoError(t, err)
|
|
err = w.AddPage(page)
|
|
require.NoError(t, err)
|
|
err = w.SetForms(reader.AcroForm)
|
|
require.NoError(t, err)
|
|
|
|
var buf bytes.Buffer
|
|
err = w.Write(&buf)
|
|
require.NoError(t, err)
|
|
|
|
// For debugging:
|
|
// ioutil.WriteFile("/tmp/test_read_write_annots_withacro.pdf", buf.Bytes(), 0644)
|
|
|
|
bufReader := bytes.NewReader(buf.Bytes())
|
|
reader, err = NewPdfReaderLazy(bufReader)
|
|
require.NoError(t, err)
|
|
|
|
checkAnnots(reader, true)
|
|
}
|
|
|
|
// Write out and reload without setting the AcroForm.
|
|
{
|
|
w := NewPdfWriter()
|
|
page, err := reader.GetPage(1)
|
|
require.NoError(t, err)
|
|
err = w.AddPage(page)
|
|
require.NoError(t, err)
|
|
|
|
var buf bytes.Buffer
|
|
err = w.Write(&buf)
|
|
require.NoError(t, err)
|
|
|
|
// For debugging:
|
|
// ioutil.WriteFile("/tmp/test_read_write_annots_noacro.pdf", buf.Bytes(), 0644)
|
|
|
|
bufReader := bytes.NewReader(buf.Bytes())
|
|
reader, err = NewPdfReaderLazy(bufReader)
|
|
require.NoError(t, err)
|
|
|
|
checkAnnots(reader, false)
|
|
}
|
|
}
|