如何定义一个显然实现为静态只读字段的对象? (使用iText 7 将多页TIFF 转PDF)
How to define an object apparently implemented as a static read-only field? (Using iText 7 to convert multi-page TIFF to PDF)
我正在用 PowerShell 编写一个使用 iText 7 DLL 的程序。我使用 DLL 反汇编工具、IText DLL 和 iText sample/example 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
。虽然我把赋值运算符右边的代码转换ok了,但是赋值运算符左边的代码我还是搞不懂。我以为我只需要定义一个 URL
类型的对象并将对 UrlUtil.toURL
的调用结果分配给 URL
对象。但是,我的方法失败了。 (注:UrlUtil.toURL
是iText
中的一个方法,class和returns是一个Microsoft [System.Uri]
对象,TEST3
是一个字符串常量,即图像文件的路径名)。
//Figure 1
URL url3 = UrlUtil.toURL(TEST3);
我在 iText API index
(http://itextsupport.com/apidocs/itext7/latest/) 中查找了 URL
。它告诉我 URL
是 class com.itextpdf.kernel.pdf.PdfName
中的一个 static variable
。我反汇编了我正在使用的 itext.kernel.dll
,我看到了一个变量初始化示例:public static readonly PdfName URL = PdfName.CreateDirectName(nameof (URL));
请参阅下面的 Figure 2
了解上下文。
在 PowerShell 中,如果 URL
是一个 class,我会像这样定义一个 URL
对象:[itext.kernel.pdf.PdfName.URL]$url = {a System.Uri object variable}
。但是,URL
是一个 static, readonly
变量,而不是 class。当我 运行 这个 PowerShell 代码时,我得到 Unable to find type [itext.kernel.pdf.PdfName.URL]
这是有道理的,因为 URL
不是 class。此外,当我在 Visual Studio 中对这个片段建模时,我得到一个错误:"Static readonly field cannot be assigned to (except in a static constructor or a variable initializer)"
(请参见带有 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()
{
}
.
.
}
}
事实证明,iText 教程 (https://developers.itextpdf.com/content/itext-7-building-blocks/chapter-3) 中的相关代码行 (URL url3 = UrlUtil.toURL(TEST3);
) 可能不正确或已弃用。对 UrlUtil.toURL(TEST3)
returns 的调用类型 System.Uri
和方法 CreateSource
接受一个 System.Uri
,因此使用类型 URL
变量([=示例中的 18=] 不需要。
// 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();
此代码可将 multi-page 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();
}
}
}
我正在用 PowerShell 编写一个使用 iText 7 DLL 的程序。我使用 DLL 反汇编工具、IText DLL 和 iText sample/example 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
。虽然我把赋值运算符右边的代码转换ok了,但是赋值运算符左边的代码我还是搞不懂。我以为我只需要定义一个 URL
类型的对象并将对 UrlUtil.toURL
的调用结果分配给 URL
对象。但是,我的方法失败了。 (注:UrlUtil.toURL
是iText
中的一个方法,class和returns是一个Microsoft [System.Uri]
对象,TEST3
是一个字符串常量,即图像文件的路径名)。
//Figure 1
URL url3 = UrlUtil.toURL(TEST3);
我在 iText API index
(http://itextsupport.com/apidocs/itext7/latest/) 中查找了 URL
。它告诉我 URL
是 class com.itextpdf.kernel.pdf.PdfName
中的一个 static variable
。我反汇编了我正在使用的 itext.kernel.dll
,我看到了一个变量初始化示例:public static readonly PdfName URL = PdfName.CreateDirectName(nameof (URL));
请参阅下面的 Figure 2
了解上下文。
在 PowerShell 中,如果 URL
是一个 class,我会像这样定义一个 URL
对象:[itext.kernel.pdf.PdfName.URL]$url = {a System.Uri object variable}
。但是,URL
是一个 static, readonly
变量,而不是 class。当我 运行 这个 PowerShell 代码时,我得到 Unable to find type [itext.kernel.pdf.PdfName.URL]
这是有道理的,因为 URL
不是 class。此外,当我在 Visual Studio 中对这个片段建模时,我得到一个错误:"Static readonly field cannot be assigned to (except in a static constructor or a variable initializer)"
(请参见带有 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()
{
}
.
.
}
}
事实证明,iText 教程 (https://developers.itextpdf.com/content/itext-7-building-blocks/chapter-3) 中的相关代码行 (URL url3 = UrlUtil.toURL(TEST3);
) 可能不正确或已弃用。对 UrlUtil.toURL(TEST3)
returns 的调用类型 System.Uri
和方法 CreateSource
接受一个 System.Uri
,因此使用类型 URL
变量([=示例中的 18=] 不需要。
// 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();
此代码可将 multi-page 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();
}
}
}