Как заполнить PDF-форму с помощью JavaScriptJavascript

Форум по Javascript
Ответить
Anonymous
 Как заполнить PDF-форму с помощью JavaScript

Сообщение Anonymous »

У меня есть следующий PDF-файл https://www.dco.uscg.mil/Portals/9/NMC/ ... G_719B.pdf
Я пробовал несколько разных способов найти доступ к текстовым полям в коде,

Код: Выделить всё

    async function fillAllFields() {
const file = document.getElementById('pdf-upload').files[0];
if (!file) return alert("Please upload a PDF");

const arrayBuffer = await file.arrayBuffer();
const pdfDoc = await PDFLib.PDFDocument.load(arrayBuffer);
const form = pdfDoc.getForm();
const fields = form.getFields();

fields.forEach(field => {
const name = field.getName();
try {
form.getTextField(name).setText(name);
const widgets = field.acroField.dict.get('Kids') || [field.acroField];
widgets.forEach(widget => {
const rect = widget.get('Rect');
if (rect) {
const [x1, y1, x2, y2] = rect.map(n => n.number);
console.log(`Field "${name}" at [${x1}, ${y1}, ${x2}, ${y2}]`);
}
});
} catch (e) {
console.log(`Skipping non-text field: ${name}`);
}
});

const pdfBytes = await pdfDoc.save();
const blob = new Blob([pdfBytes], { type: "application/pdf" });
const link = document.createElement("a");
link.href = URL.createObjectURL(blob);
link.download = "filled_with_names.pdf";
link.click();
}
Однако это не дает мне доступа к текстовым полям, я попытался изменить его и добавить текст выше, например {{First_name}}, в надежде, что я смогу получить доступ к этому фрагменту текста и изменить его, однако, когда я использую PDFPlumber для извлечения текста, он не возвращает его

Код: Выделить всё

import pdfplumber

with pdfplumber.open("CG_719B_filled.pdf") as pdf:
for page in pdf.pages:
if page.page_number == 2:
print(page.extract_text)
print(page.extract_text())
Итак, теперь я проверяю наличие какой-либо аркоформы, но, похоже, ее нет.

Код: Выделить всё

import pdfplumber
from pdfplumber.utils.pdfinternals import resolve_and_decode, resolve

pdf = pdfplumber.open("CG_719B_filled.pdf")

def parse_field_helper(form_data, field, prefix=None):
"""appends any PDF AcroForm field/value pairs in `field` to provided `form_data` list

if `field` has child fields, those will be parsed recursively.
"""
resolved_field = field.resolve()
field_name = ".".join(
filter(lambda x: x, [prefix, resolve_and_decode(resolved_field.get("T"))])
)
if "Kids" in resolved_field:
for kid_field in resolved_field["Kids"]:
parse_field_helper(form_data, kid_field, prefix=field_name)
if "T" in resolved_field or "TU" in resolved_field:
# "T" is a field-name, but it's sometimes absent.
# "TU" is the "alternate field name" and is often more human-readable
# your PDF may have one, the other, or both.
alternate_field_name = (
resolve_and_decode(resolved_field.get("TU"))
if resolved_field.get("TU")
else None
)
field_value = (
resolve_and_decode(resolved_field["V"]) if "V" in resolved_field else None
)
form_data.append([field_name, alternate_field_name, field_value])

form_data = []

# Check if the PDF has an AcroForm (interactive form fields)
if "AcroForm" in pdf.doc.catalog:
acro_form = resolve(pdf.doc.catalog["AcroForm"])
if "Fields"  in acro_form:
fields = resolve(acro_form["Fields"])
for field in fields:
parse_field_helper(form_data, field)
print(form_data)
else:
print("PDF has AcroForm but no Fields")
else:
print("PDF does not contain an AcroForm (no interactive form fields)")

pdf.close()
PDF не содержит AcroForm (нет полей интерактивной формы):(
Почему я думал, что заполнить форму PDF будет так легко, я не знаю, какой путь выбрать, у меня почти возникает искушение переделать всю форму во что-то, что можно быстро заполнить переменными, которые можно заменить.
Я был бы признателен, если бы кто-нибудь объяснил, что именно в этом заключается проблема, и как я мог бы ее решить: либо преобразовать ее в Acroform с полями, а затем использовать простой способ ссылки и добавления данных, либо способ воссоздать эту форму, которая будет заполнена с помощью кода.

Подробнее здесь: https://stackoverflow.com/questions/797 ... javascript
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»