notas de estudio de itext7-Capítulo 4

Prefacio

itext4-1

    En los capítulos anteriores, creamos un archivo PDF y le agregamos contenido. Si estamos utilizando el API de alto nivel (por ejemplo Paragraph) o una API de bajo nivel (por ejemplo lineTO(), MoveTo, stroke()), iText api éstos se convertirá en la gramática pdf, que será escrita flujo de contenido pdf gramática (flujo de contenido). En este capítulo, presentaremos una característica diferente de las anotaciones de contenido (consulte la Figura 1 anterior). Las anotaciones no forman parte del flujo de contenido, generalmente se colocan encima del contenido existente. Hay muchos tipos de anotaciones y la mayoría de las anotaciones permiten la interacción del usuario.

Agregar comentario

    Comencemos con un ejemplo simple, como se muestra en la Figura 1. Primero agregamos un Paragraphtipo de texto y luego agregamos un comentario verde antes del texto.

itext4-2

Figura 1. Una anotación de texto

    La mayor parte del código de este ejemplo es exactamente igual que el ejemplo de HelloWorld del Capítulo 1, excepto por la creación y adición de comentarios:

PdfAnnotation ann = new PdfTextAnnotation(new Rectangle(20, 800, 0, 0))
    .setColor(Color.GREEN)
    .setTitle(new PdfString("iText"))
    .setContents("With iText, "
        + "you can truly take your documentation needs to the next level.")
    .setOpen(true);
pdf.getFirstPage().addAnnotation(ann);

    Definimos Rectanglela posición de la nota de texto definiendo un método, luego establecemos el color, el título de la nota ( PdfStringobjeto), el contenido ( Stringobjeto) y las opciones de apertura de comentarios, y finalmente PdfDocumentobtenemos el objeto de la primera página a través del objeto y agregamos la nota.
    Después de este ejemplo, echemos un vistazo al siguiente ejemplo, como se muestra en la Figura 2. Hemos creado una anotación visual. Si pasa el mouse cerca, se mostrará un sitio web original. Podemos abrir el enlace haciendo clic en el texto. Este es el comentario del enlace.

itext4-3

Figura 2. Una anotación de enlace

    Debido a que la posición del comentario es parte de la oración, es extremadamente inconveniente si necesitamos calcular la posición de aquí en la oración. Afortunadamente, podemos envolver el comentario del enlace en un Linkobjeto e iText calculará automáticamente el comentario Rectangle. El código es el siguiente:

PdfLinkAnnotation annotation = new PdfLinkAnnotation(new Rectangle(0, 0))
        .setAction(PdfAction.createURI("http://itextpdf.com/"));
Link link = new Link("here", annotation);
Paragraph p = new Paragraph("The example of link annotation. Click ")
        .add(link.setUnderline())
        .add(" to learn more...");
document.add(p);

    En la línea 2, creamos un URI, que puede abrir el sitio web oficial de iText. Tomamos esta acción como parámetro de la anotación de enlace y luego creamos un linkobjeto: este es un objeto de dibujo básico que acepta un objeto de anotación de enlace como parámetro. Este comentario de enlace no se agregará al flujo de contenido porque el comentario no pertenece al flujo de contenido. Por el contrario, las notas del enlace se colocarán en una ubicación específica en una página específica. Hacer que se pueda hacer clic en el texto no cambia la apariencia del texto en el flujo de contenido. Subrayamos aquí para saber dónde hacer clic en el enlace.
    Los diferentes tipos de anotaciones aceptan sus propios parámetros definidos, como se muestra en la Figura 3 a continuación es una anotación de línea:

itext4-4

Figura 3. Una anotación de línea

    El siguiente código muestra cómo convertirse en:

PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
PdfPage page = pdf.addNewPage();
PdfArray lineEndings = new PdfArray();
lineEndings.add(new PdfName("Diamond"));
lineEndings.add(new PdfName("Diamond"));
PdfAnnotation annotation = new PdfLineAnnotation(
    new Rectangle(0, 0),
    new float[]{20, 790, page.getPageSize().getWidth() - 20, 790})
        .setLineEndingStyles((lineEndings))
        .setContentsAsCaption(true)
        .setTitle(new PdfString("iText"))
        .setContents("The example of line annotation")
        .setColor(Color.BLUE);
page.addAnnotation(annotation);
pdf.close();

    En este ejemplo, agregamos el comentario a la página recién creada y no creamos un Documentobjeto aquí .
    ISO-32000-2 define 28 anotaciones diferentes, dos de las cuales están obsoletas en PDF2.0, puede utilizar las 26 anotaciones restantes, debido a limitaciones de espacio, las anotaciones diferentes restantes no se darán una por una Ahora, esperemos y dirijamos nuestra atención a las anotaciones interactivas, primero observe la Figura 4 a continuación:

itext4-5

Figura 4. Una anotación de marcado

    En este ejemplo de TextMarkupAnnotation, el código es el siguiente, es posible que necesitemos un capítulo especial para hablar sobre el código (los extranjeros tienen una gran capacidad para enterrar pozos)

PdfAnnotation ann = PdfTextMarkupAnnotation.createHighLight(
        new Rectangle(105, 790, 64, 10),
        new float[]{169, 790, 105, 790, 169, 800, 105, 800})
    .setColor(Color.YELLOW)
    .setTitle(new PdfString("Hello!"))
    .setContents(new PdfString("I'm a popup."))
    .setTitle(new PdfString("iText"))
    .setOpen(true)
    .setRectangle(new PdfArray(new float[]{100, 600, 200, 100}));
pdf.getFirstPage().addAnnotation(ann);

    En la siguiente sección, crearemos un formulario interactivo con diferentes campos de formulario. Cada campo de formulario de este formulario corresponderá a una anotación de widget, pero estas anotaciones se crearán implícitamente.

Crea formularios interactivos

    En el siguiente ejemplo, usamos la tecnología AcroForm para crear formularios interactivos. AcroForm es la tecnología mencionada por primera vez en PDF1.2 (1992). Esta tecnología puede llenar varios campos de formulario en documentos PDF, como campos de texto, cuadros de selección (cuadros combinados o listas, etc.), botones (botones de presión) , Casillas de verificación, botones de opción, etc.) y campos de firma

Es tentador comparar formularios PDF con formularios HTML, pero está mal. Cuando la longitud del texto excede el área de texto disponible del formulario HTML, esta área de texto se puede cambiar de tamaño. El contenido de los campos de la lista se puede actualizar instantáneamente en función de la consulta al servidor. En resumen, los formularios HTML pueden ser muy dinámicos.
Pero para formularios interactivos con tecnología AcroForm, esto no es posible. Esta forma de formulario se compara mejor con el formulario en papel. Cada campo tiene su posición y tamaño fijos. La idea de utilizar formularios PDF para recopilar datos de usuario en un navegador web se ha abandonado durante muchos años. Los formularios HTML son más fáciles de usar para la recopilación de datos en línea.

    Pero esto no significa que la tecnología AcroForm sea inútil. La tecnología AcroForm se utiliza en los siguientes dos escenarios de aplicación:

  1. Cuando el formulario es equivalente a papel digital : En algunos casos, existen requisitos de formulario estrictos para el formulario. Es importante que el documento digital sea una copia exacta del formulario correspondiente. Cada formulario que complete debe cumplir con los mismos requisitos formales. Si este es el caso, es mejor utilizar formato PDF que formato HTML.
  2. Cuando el formulario no se utiliza para la recopilación de datos, sino como una plantilla : Por ejemplo: tiene un formulario que representa un cupón o un boleto de admisión a un evento. En este formulario tienes diferentes campos, como quién compró la entrada, fecha y hora del evento, número de asiento, etc. Cuando las personas compran boletos, no necesita volver a generar un vale completo, puede usar el formulario y simplemente completar los datos correspondientes.

    En estos dos escenarios de aplicación, podemos crear formularios manualmente a través de la interfaz gráfica del software Abode, LibreOffice y otros ataques.
    También puede crear un formulario de este tipo mediante programación, pero hay muy pocos casos útiles en los que puede usar una biblioteca de software para crear un formulario o plantilla en lugar de usar una herramienta con una GUI. Sin embargo, tenemos que intentarlo. Primero mire la Figura 5:

itext4-6

Figura 5. Un formulario interactivo

    En la imagen de arriba, podemos ver campos de texto, botones de radio, casillas de verificación, cuadros de lista desplegables, campos de texto de varias líneas y un botón. Vemos estos campos porque están representados por comentarios de widget. Cuando creamos un campo, este comentario de widget se crea implícitamente. En el siguiente código, primero creamos otro PdfAcroFormobjeto. El primer parámetro es un PdfDocumentparámetro de tipo, Documentque se obtiene del objeto. El segundo parámetro es un valor booleano, que indica si este nuevo formulario se crea o no, si no hay un formulario conocido. . Debido a que Documentel objeto que acabamos de crear no tiene un formulario, lo establecemos en Verdadero. el código se muestra a continuación:

PdfAcroForm form = PdfAcroForm.getAcroForm(doc.getPdfDocument(), true);

    Ahora podemos agregarle campos, usaremos Rectanglela posición y el tamaño de una anotación de widget.

Campo de texto

    Comenzaremos con el campo de texto que se utilizará para el Nombre completo. El siguiente código:

PdfTextFormField nameField = PdfTextFormField.createText(
    doc.getPdfDocument(), new Rectangle(99, 753, 425, 15), "name", "");
form.addField(nameField);

    createText()El método requiere una PdfDocumentinstancia, un Rectanglenombre de dominio y un valor predeterminado (en este ejemplo, el valor predeterminado es un vacío String). Vale la pena señalar que la etiqueta del campo de texto y el comentario del widget son diferentes. Usamos uno Paragraphpara agregar "Nombre completo". Esto Paragraphes parte del flujo de contenido. El campo de texto no forma parte del flujo de contenido, se puede representar mediante un pequeño comentario de widget.

solo botón

    Creamos un botón de radio para seleccionar un idioma, cabe señalar que hay un languagegrupo de radio con un nombre , y hay cinco botones sin nombre, y solo uno de ellos será seleccionado.

PdfButtonFormField group = PdfFormField.createRadioGroup(
    doc.getPdfDocument(), "language", "");
PdfFormField.createRadioButton(doc.getPdfDocument(),
    new Rectangle(130, 728, 15, 15), group, "English");
PdfFormField.createRadioButton(doc.getPdfDocument(),
    new Rectangle(200, 728, 15, 15), group, "French");
PdfFormField.createRadioButton(doc.getPdfDocument(),
    new Rectangle(260, 728, 15, 15), group, "German");
PdfFormField.createRadioButton(doc.getPdfDocument(),
    new Rectangle(330, 728, 15, 15), group, "Russian");
PdfFormField.createRadioButton(doc.getPdfDocument(),
    new Rectangle(400, 728, 15, 15), group, "Spanish");
form.addField(group);

Caja

    En el siguiente fragmento de código, introduciremos tres botones de control, llamado experience0, experience1y experience2:

for (int i = 0; i < 3; i++) {
    PdfButtonFormField checkField = PdfFormField.createCheckBox(
        doc.getPdfDocument(), new Rectangle(119 + i * 69, 701, 15, 15),
        "experience".concat(String.valueOf(i+1)), "Off",
        PdfFormField.TYPE_CHECK);
    form.addField(checkField);
}

    Como puede ver, usamos el createCheckBox()método y los parámetros de la función son: PdfDocumentobjeto Rectangle, el nombre de la casilla de verificación, el valor actual y la apariencia de la marca de verificación.

Hay dos valores posibles para el valor de una casilla de verificación: el valor del estado no seleccionado debe estar "desactivado"; el valor seleccionado suele ser "Sí" (este es el valor predeterminado utilizado por iText), pero se pueden usar otros valores aquí, dependiendo de su propio De elección.

    Podemos seleccionar una o más opciones de un cuadro de lista o un cuadro de lista desplegable En terminología PDF, lo llamamos campo de elección (campo de elección).

Campo de elección

    Aquí, creamos un cuadro de lista desplegable, seleccionamos el nombre del campo como "shift"y proporcionamos tres Anyopciones , de las cuales la opción está seleccionada por defecto.

String[] options = {"Any", "6.30 am - 2.30 pm", "1.30 pm - 9.30 pm"};
PdfChoiceFormField choiceField = PdfFormField.createComboBox(
    doc.getPdfDocument(), new Rectangle(163, 676, 115, 15),
    "shift", "Any", options);
form.addField(choiceField);

Cuadro de texto de varias líneas

    El cuadro de texto de varias líneas es Xiangan en comparación con el cuadro de texto normal.
Si el contenido agregado excede el contenido que se puede mostrar en una sola línea, el texto de este campo solo mostrará una parte y el resto se ajustará.

PdfTextFormField infoField = PdfTextFormField.createMultilineText(
    doc.getPdfDocument(), new Rectangle(158, 625, 366, 40), "info", "");
form.addField(infoField);

Presionar el botón

    En un ejemplo real, usaremos un botón de envío para permitir que las personas envíen los datos que ingresan en el formulario al servidor. Este tipo de formulario PDF se ha vuelto poco común, ya que HTML evolucionó a HTML 5 y tecnologías relacionadas, introduciendo funciones más fáciles de usar para completar formularios. Terminamos el ejemplo agregando un botón de reinicio, que reiniciará el campo seleccionado a su valor inicial cuando se haga clic en el botón.

PdfButtonFormField button = PdfFormField.createPushButton(doc.getPdfDocument(),
        new Rectangle(479, 594, 45, 15), "reset", "RESET");
button.setAction(PdfAction.createResetForm(
    new String[] {"name", "language", "experience1", "experience2",
        "experience3", "shift", "info"}, 0));
form.addField(button);

    Si desea utilizar iText para crear un formulario PDF, ahora puede comprender bien cómo se completó. En muchos casos, es una mejor idea utilizar una herramienta con una interfaz gráfica de usuario para crear manualmente un formulario. Luego, usará iText para completar automáticamente este formulario, por ejemplo, usando datos de una base de datos.

Completa formularios interactivos

    Cuando terminamos de crear el formulario, podemos establecer sus valores predeterminados, como se muestra en la Figura 6:

itext4-7

Figura 6. Un formulario interactivo completo

    Una vez que hemos creado el formulario, podemos establecer los valores de estos campos, el código es el siguiente:

Map<String, PdfFormField> fields = form.getFormFields();
fields.get("name").setValue("James Bond");
fields.get("language").setValue("English");
fields.get("experience1").setValue("Off");
fields.get("experience2").setValue("Yes");
fields.get("experience3").setValue("Yes");
fields.get("shift").setValue("Any");
fields.get("info").setValue("I was 38 years old when I became an MI6 agent.");

    Todos queríamos PdfAcroFormagregar una variedad de campos al objeto (variable de formulario) antes . Usamos este objeto para obtener cada campo Map, y luego podemos establecer el valor uno por uno. Por supuesto, hay otras formas más efectivas de completar. La técnica generalmente se aplica para completar previamente un formulario existente.

Rellenar previamente formularios existentes

    En este ejemplo, obtenemos un formulario de un pdf que existe en PdfAcroFormel formulario y luego operamos como el código anterior:

PdfDocument pdf = new PdfDocument(
    new PdfReader(src), new PdfWriter(dest));
PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, true);
Map<String, PdfFormField> fields = form.getFormFields();
fields.get("name").setValue("James Bond");
fields.get("language").setValue("English");
fields.get("experience1").setValue("Off");
fields.get("experience2").setValue("Yes");
fields.get("experience3").setValue("Yes");
fields.get("shift").setValue("Any");
fields.get("info").setValue("I was 38 years old when I became an MI6 agent.");
pdf.close();

    En la segunda línea, PdfReaderuno permite que iText lea diferentes tipos de objetos en srcel pdf , lo que apunta a la ruta del archivo pdf existente.

En iText, la E / S es manejada por dos clases: 1. PdfReaderResponsable de la entrada 2. PdfWriterResponsable de la salida

    La primera línea y la segunda línea PdfDocumentson diferentes de la forma que hemos creado antes . Aquí recibimos readery writerobjeto como parámetros al mismo tiempo , y luego usamos para getAcroForm()conseguir el PdfAcroFormobjeto, y el resto de las operaciones son los mismos que anteriormente.

Aquí el formulario sigue siendo interactivo: la gente todavía cambia el valor correspondiente según sea necesario. iText se ha utilizado en muchas aplicaciones para completar formularios. Por ejemplo: cuando un usuario inicia sesión en un servidor en línea, el servidor ya conoce mucha información (como nombre, dirección, número de teléfono). Cuando necesitan completar un formulario en línea, no tiene mucho sentido proporcionarles un documento en blanco, y deben ingresar su nombre, dirección y número de teléfono nuevamente. Si estos valores ya existen en el formulario, puede ahorrar mucho tiempo. Esto se puede lograr completando previamente el formulario con iText. Las personas pueden verificar si la información es correcta y, si no lo es (por ejemplo, porque se ha cambiado su número de teléfono), aún pueden cambiar su contenido en el sitio.

    A veces no queremos que el usuario final cambie el contenido del PDF. Si el formulario es un comprobante con una fecha y hora específicas, no queremos que el usuario final cambie la fecha y la hora. En este caso, el formulario se bloqueará

Forma de bloqueo

    Agregamos una declaración al código anterior. El anterior "Este archivo incluye campos de formulario rellenables" desaparece. Después de hacer clic en Nombre completo, no puede cambiar manualmente el valor, como se muestra en la Figura 7:

itext4-8

Figura 7. Un formulario bloqueado

    El código es el siguiente, agregue la línea 12 form.flattenFields(), todos los campos se bloquearán y el comentario del widget correspondiente será reemplazado por el contenido.

para resumir

    En este capítulo presentamos muchos tipos de comentarios

  • Anotación de texto
  • Anotación de línea
  • Anotación de marcado
  • Anotación de widget (anotación de widget)

    En el ejemplo de llenar y bloquear el formulario, presentamos PdfReaderesta clase, en los siguientes capítulos, continuaremos discutiendo esta clase.

Algo de la semana pasada no se ha actualizado por el momento. Lo llenaré hoy. Espero que pueda seguir prestando atención a mi serie de artículos ~ Gracias por su apoyo.

Supongo que te gusta

Origin blog.csdn.net/u012397189/article/details/77942866
Recomendado
Clasificación