Как определить объект, по-видимому, реализованный как статическое поле только для чтения? (Использование iText 7 для преобразования многостраничного TIFF в PDF)

Я пишу программу в PowerShell, которая использует библиотеки iText 7. Я использую инструмент дизассемблирования DLL, библиотеки DLL IText и образец C / примера кода iText / C# и преобразовываю пример кода C# в код PowerShell.

Например:

Пример кода iText

PdfWriter writer = new PdfWriter(dest);
PdfDocument pdfDoc = new PdfDocument(writer);

PowerShell

[itext.kernel.pdf.PdfWriter]$newPdfWriter = New-Object itext.kernel.pdf.PdfWriter(($outputFolderPath + "\" + $newPdfName))
[itext.kernel.pdf.PdfDocument]$newPdfDoc = New-Object itext.kernel.pdf.PdfDocument($newPdfWriter)

В одном примере кода iText C# есть строка кода, которую я не понимаю. See Figure 1 below, Несмотря на то, что я преобразовал код справа от оператора присваивания, я не могу понять код слева от оператора присваивания. Я думал, что мне просто нужно определить объект типа URL и назначить результаты вызова UrlUtil.toURL к URL объект. Но мой подход терпит неудачу. (Заметка: UrlUtil.toURL это метод в iText класс и возвращает Microsoft [System.Uri] объект и TEST3 строковая константа, т. е. путь к файлу изображения).

//Figure 1
URL url3 = UrlUtil.toURL(TEST3);

Я посмотрел вверх URL в iText API index ( http://itextsupport.com/apidocs/itext7/latest/). Это говорит мне, что URL это static variable в классе com.itextpdf.kernel.pdf.PdfName, Я разобрал itext.kernel.dll что я использую, и я вижу, что выглядит как пример инициализации переменной: public static readonly PdfName URL = PdfName.CreateDirectName(nameof (URL)); Увидеть Figure 2 ниже для контекста.

В PowerShell, если URL был класс, я бы определил URL объект как это: [itext.kernel.pdf.PdfName.URL]$url = {a System.Uri object variable}, Но, URL это static, readonly переменная, а не класс. Когда я запускаю этот код PowerShell, я получаю Unable to find type [itext.kernel.pdf.PdfName.URL] что имеет смысл с URL это не класс. Кроме того, когда я моделирую этот фрагмент в Visual Studio, я получаю сообщение об ошибке: "Static readonly field cannot be assigned to (except in a static constructor or a variable initializer)" (см. скриншот с кодом C#). Я исследовал эту ошибку, но тоже не понимаю.

снимок экрана моей маленькой модели C#, показывающей

Итак, код C# URL url3 = UrlUtil.toURL(TEST3); выглядит как System.Uri объект присваивается объекту типа URL,

Что на самом деле происходит здесь во время выполнения в примере кода iText C#?

Как определить объект типа URL?

//Figure 2
namespace iText.Kernel.Pdf
{
    public class PdfName : PdfPrimitiveObject, IComparable<PdfName>
    {
       .
       .
       public static readonly PdfName URL = PdfName.CreateDirectName(nameof (URL));
       protected internal string value;
       .
       .

       private static PdfName CreateDirectName(string name)
       {
           return new PdfName(name, true);
       }

       public PdfName(string value)
       {
           this.value = value;
       }

       private PdfName(string value, bool directOnly) : base(directOnly)
       {
           this.value = value;
       }

       public PdfName(byte[] content) : base(content)
       {
       }

       private PdfName()
       {
       }

       .
       .
    }
}

1 ответ

Решение

Как выясняется, это может быть, что строка кода в вопросе (URL url3 = UrlUtil.toURL(TEST3);) в учебном пособии по iText ( https://developers.itextpdf.com/content/itext-7-building-blocks/chapter-3) может быть неправильным или устарелым. Призыв к UrlUtil.toURL(TEST3) возвращает тип System.Uri и метод CreateSource принимает System.Uri, так что использование типа URL переменная (url3 в примере) не нужно.

// iText Tutorial
URL url3 = UrlUtil.toURL(TEST3);

IRandomAccessSource ras3 = new RandomAccessSourceFactory().createSource(url3);

RandomAccessFileOrArray raf3 = new RandomAccessFileOrArray(ras3);

int pages3 = TiffImageData.getNumberOfPages(raf3);

for (int i = 1; i <= pages3; i++) 
{
    img = new Image(
    ImageDataFactory.createTiff(url3, true, i, true));
    document.add(img);
}

document.close();

Этот код работает для преобразования многостраничного TIF в PDF

using iText.IO.Font;
using iText.IO.Image;
using iText.IO.Source;
using iText.IO.Util;
using iText.Kernel.Font;
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;
using iText.Layout.Properties;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace x_console
{
    class Program
    {
        static void Main(string[] args)
        {
            PdfWriter writer = new PdfWriter("C:\\Users\\Bill\\Desktop\\out.pdf");
            PdfDocument pdf = new PdfDocument(writer);
            Document document = new Document(pdf);

            Uri tiffFqn = UrlUtil.ToURL("C:\\Users\\Bill\\Desktop\\Multipage Test Image.tif");
            IRandomAccessSource iRandomAccessSource = new RandomAccessSourceFactory().CreateSource(tiffFqn);
            RandomAccessFileOrArray randomAccessFileOrArray = new RandomAccessFileOrArray(iRandomAccessSource);

            int tiffPageCount = TiffImageData.GetNumberOfPages(randomAccessFileOrArray);

            for (int i = 1; i <= tiffPageCount; i++)
            {
                Image tiffPage = new Image(ImageDataFactory.CreateTiff(tiffFqn, true, i, true));
                document.Add(tiffPage);
            }

            document.Close();
        }
    }
}
Другие вопросы по тегам