Общие случаи использования Aspose.PDF FOSS for Go
Aspose.PDF FOSS for Go — это чисто Go модуль для управления PDF-документами. В этой статье рассматриваются наиболее часто требуемые операции с использованием типов Document, Form, EncryptionOptions, Table и OutlineItemCollection.
go get github.com/aspose-pdf-foss/aspose-pdf-foss-for-goПошаговое руководство
Шаг 1: Установите пакет
Добавьте зависимость Go-модуля:
go get github.com/aspose-pdf-foss/aspose-pdf-foss-for-goШаг 2: импортировать пакет
Используйте псевдоним, чтобы сделать ссылки на импорт краткими:
import (
"fmt"
pdf "github.com/aspose-pdf-foss/aspose-pdf-foss-for-go"
)Шаг 3: разбить PDF на файлы по страницам
Document.Split разделяет многостраничный документ на один *Document на страницу.
doc, err := pdf.Open("report.pdf")
if err != nil {
panic(err)
}
pages, _ := doc.Split()
for i, p := range pages {
p.Save(fmt.Sprintf("report_page_%03d.pdf", i+1))
}
fmt.Printf("Split %d pages\n", len(pages))Шаг 4: объединить несколько PDF в один
Document.Append объединяет страницы из второго документа на месте перед сохранением.
base, _ := pdf.Open("intro.pdf")
chapter1, _ := pdf.Open("chapter1.pdf")
chapter2, _ := pdf.Open("chapter2.pdf")
appendix, _ := pdf.Open("appendix.pdf")
base.Append(chapter1)
base.Append(chapter2)
base.Append(appendix)
base.Save("full_document.pdf")Шаг 5: применить шифрование паролем
EncryptionOptions настраивает пользовательский пароль, пароль владельца, алгоритм и per-operation Permissions за один вызов:
doc, _ := pdf.Open("contract.pdf")
doc.SetEncryption(pdf.EncryptionOptions{
UserPassword: "clientpass",
OwnerPassword: "adminpass",
Permissions: &pdf.Permissions{AllowPrint: true, AllowCopy: false},
})
doc.Save("contract_protected.pdf")Чтобы создать копию в виде обычного текста из зашифрованного файла:
doc, _ := pdf.OpenWithPassword("contract_protected.pdf", "clientpass")
doc.RemoveEncryption()
doc.Save("contract_decrypted.pdf")Шаг 6: Заполнить AcroForm
Итерировать или выбирать поля по имени. Проверить конкретный тип (TextBoxField, CheckboxField, RadioButtonField, ComboBoxField, ListBoxField).
doc, _ := pdf.Open("application_form.pdf")
name := doc.Form().Field("applicant_name").(*pdf.TextBoxField)
name.SetValue("Jane Doe")
agree := doc.Form().Field("terms_accepted").(*pdf.CheckboxField)
agree.SetChecked(true)
country := doc.Form().Field("country").(*pdf.ComboBoxField)
country.SetSelected(0)
doc.Save("application_filled.pdf")Шаг 7: Построить макет таблицы
Добавить Table с Row и Cell записями на страницу для создания счета или отчёта:
doc, _ := pdf.Open("invoice_template.pdf")
page, _ := doc.Page(1)
tbl := pdf.NewTable()
tbl.SetColumnWidths([]float64{200, 80, 100})
header := tbl.AddRow()
header.AddCell("Description")
header.AddCell("Qty")
header.AddCell("Amount")
row := tbl.AddRow()
row.AddCell("PDF Processing Service")
row.AddCell("1")
row.AddCell("$500.00")
page.AddTable(tbl, pdf.Rectangle{LLX: 72, LLY: 100, URX: 540, URY: 700})
doc.Save("invoice.pdf")Шаг 8: Добавить дерево закладок
OutlineItemCollection создаёт закладки с вложенностью глав/разделов и целевыми страницами DestinationXYZ:
doc, _ := pdf.Open("manual.pdf")
page1, _ := doc.Page(1)
page2, _ := doc.Page(2)
ch1 := pdf.NewOutlineItemCollection(doc)
ch1.SetTitle("Introduction")
ch1.SetBold(true)
ch1.SetDestination(pdf.NewDestinationXYZ(page1, 0, 792, 1.0))
doc.Outlines().Add(ch1)
ch2 := pdf.NewOutlineItemCollection(doc)
ch2.SetTitle("Configuration")
ch2.SetDestination(pdf.NewDestinationFit(page2))
doc.Outlines().Add(ch2)
doc.Save("manual_bookmarked.pdf")Распространённые проблемы и их решения
pdf.Open возвращает ошибку для корректных PDF-файлов Проверьте, что путь к файлу правильный и что файл не открыт в другом процессе. В Windows блокировка файла может препятствовать чтению.
Паника при приведении типа при доступе к полям формы Используйте pdf.FieldType(f) или оператор type switch для проверки типа поля перед приведением. A *pdf.TextBoxField приведение к CheckboxField вызовет панику.
go get завершается с ошибкой “module not found” Ensure GOPROXY установлен на доступный прокси (например, GOPROXY=direct) и что ваша сеть может достичь github.com. В изолированных (air-gapped) средах используйте GONOSUMCHECK или локальное зеркало модулей.
SaveTo завершается с ошибкой после OpenWithPassword Если вы вызываете Save after OpenWithPassword не вызывая RemoveEncryption, вывод повторно шифруется оригинальным паролем. Это ожидаемое поведение — вызов RemoveEncryption явно для создания копии в виде простого текста.
Количество страниц в объединённом документе неверно Append изменяет получатель непосредственно на месте. Убедитесь, что вы не вызываете Append на документе, который уже сохранён; откройте базовый документ заново, если вам нужно создать несколько объединённых выводов.
Часто задаваемые вопросы
Можно ли обрабатывать PDF-файлы без записи их на диск?
Document.WriteTo принимает io.Writer, так что вы можете писать в буфер, сетевой поток или response writer без создания временного файла.
Безопасно ли использовать Aspose.PDF FOSS для Go конкурентно?
Каждый экземпляр *Document не является безопасным для горутин. Используйте один Document на горутину или защищайте общие экземпляры с помощью мьютекса.
Как прочитать значения полей из заполненной формы?
Используйте Field.Value() на любом поле или выполните приведение типа, чтобы получить доступ к типо-специфичным аксессорам, таким как CheckboxField.Checked() или ComboBoxField.SelectedIndex().
Могу ли я создать PDF с нуля без существующего шаблона?
Да. pdf.NewDocument() создает пустой документ. Вызовите AddBlankPageFromFormat(pdf.PageFormatA4), чтобы добавить пустую страницу, затем добавьте содержимое (таблицы, аннотации и т.д.) перед сохранением.
В чем разница между Document.Save и Document.WriteTo?
Save(path string) записывает в путь к файлу. WriteTo(w io.Writer) записывает в любой io.Writer — полезно для HTTP ответов, буферов или потоковых конвейеров.