Общие случаи использования Aspose.PDF FOSS for Go

Общие случаи использования 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 ответов, буферов или потоковых конвейеров.


См. также:

 Русский