1

我正在 PowerShell 中编写一个使用 iText 7 DLL 的程序。我使用 DLL 反汇编工具、IText DLL 和 iText 示例/示例 C# 代码并将示例 C# 代码转换为 PowerShell 代码。

例如:

iText 示例代码

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

电源外壳

[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 indexhttp://itextsupport.com/apidocs/itext7/latest/)中查找。它告诉我那URLstatic 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()
       {
       }

       .
       .
    }
}
4

1 回答 1

0

事实证明,URL url3 = UrlUtil.toURL(TEST3);iText 教程 ( https://developers.itextpdf.com/content/itext-7-building-blocks/chapter-3 ) 中有问题的代码行 ( ) 可能不正确或已弃用。调用UrlUtil.toURL(TEST3)返回类型System.Uri并且方法CreateSource接受 a ,因此不需要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();
        }
    }
}
于 2018-03-10T15:03:47.290 回答