Itextsharp 阅读罗马文页码
在Adobe Reader中,电子书的第一页可以有罗马格式的页码,如下图所示 图片: 我想用iText读出这些页码(不是索引页码),但我不知道应该使用哪些属性(标签或注释…)。我已经可以用PdfReader打开文件,循环浏览所有页面,但不知道这些罗马数字应该访问什么Itextsharp 阅读罗马文页码,itextsharp,itext,Itextsharp,Itext,在Adobe Reader中,电子书的第一页可以有罗马格式的页码,如下图所示 图片: 我想用iText读出这些页码(不是索引页码),但我不知道应该使用哪些属性(标签或注释…)。我已经可以用PdfReader打开文件,循环浏览所有页面,但不知道这些罗马数字应该访问什么 using (Stream pdfStream = new FileStream(sourceFileName, FileMode.Open)) { PdfReader pdfReader = new PdfReader(p
using (Stream pdfStream = new FileStream(sourceFileName, FileMode.Open))
{
PdfReader pdfReader = new PdfReader(pdfStream);
for (int index = 1; index <= pdfReader.NumberOfPages; index++)
{
}
}
使用(Stream pdfStream=newfilestream(sourceFileName,FileMode.Open))
{
PdfReader PdfReader=新PdfReader(pdfStream);
对于(int index=1;index您正在查找。在本例中,我们有一个PDF,其页面编号如下:
A
B
1
2
3
Movies-4
Movies-5
Movies-6
Movies-7
Movies-8
在listPageLabels()
方法中,我们创建一个包含所有页面标签的txt文件:
public void listPageLabels(String src, String dest) throws IOException {
// no PDF, just a text file
PrintStream out = new PrintStream(new FileOutputStream(dest));
PdfReader reader = new PdfReader(src);
String[] labels = PdfPageLabels.getPageLabels(reader);
for (int i = 0; i < labels.length; i++) {
out.println(labels[i]);
}
out.flush();
out.close();
reader.close();
}
如果您想要一个iTextSharp示例,请查看以下方法:
/**
* Reads the page labels from an existing PDF
* @param src the existing PDF
*/
public string ListPageLabels(byte[] src) {
StringBuilder sb = new StringBuilder();
String[] labels = PdfPageLabels.GetPageLabels(new PdfReader(src));
for (int i = 0; i < labels.Length; i++) {
sb.Append(labels[i]);
sb.AppendLine();
}
return sb.ToString();
}
GetPageLabels函数将组合组件PdfName.P和PdfName.S以返回此处记录的结果,因此,我在输出时接收到的不仅是pagenumber,还有作为前缀的PdfName.P组件。请参见下面的图像示例图像:我不确定是否可以轻松获得罗马页码值,或者我必须这样做代码类似于GetPageLabels。如果有前缀,iText将添加它,因为它是页面标签的一部分。当然,如果您不想这样做,您可以编写一个略为不同的版本的GetPageLabels()
方法来省略前缀。(我现在很忙,但稍后我会在我的答案中添加一个指向PdfPageLabels类C#版本的链接。)谢谢你的代码。如果有更好的想法,让我们等待。再次感谢。我是iText的原始开发人员。我编写了PdfPageLabels
类(Java版本)。我知道iText中没有其他可用的方法(尖锐)不使用前缀;-)
public static String[] GetPageLabels(PdfReader reader) {
int n = reader.NumberOfPages;
PdfDictionary dict = reader.Catalog;
PdfDictionary labels = (PdfDictionary)PdfReader.GetPdfObjectRelease(dict.Get(PdfName.PAGELABELS));
if (labels == null)
return null;
String[] labelstrings = new String[n];
Dictionary<int, PdfObject> numberTree = PdfNumberTree.ReadTree(labels);
int pagecount = 1;
char type = 'D';
for (int i = 0; i < n; i++) {
if (numberTree.ContainsKey(i)) {
PdfDictionary d = (PdfDictionary)PdfReader.GetPdfObjectRelease(numberTree[i]);
if (d.Contains(PdfName.ST)) {
pagecount = ((PdfNumber)d.Get(PdfName.ST)).IntValue;
}
else {
pagecount = 1;
}
if (d.Contains(PdfName.S)) {
type = ((PdfName)d.Get(PdfName.S)).ToString()[1];
}
else {
type = 'e';
}
}
switch (type) {
default:
labelstrings[i] = "" + pagecount;
break;
case 'R':
labelstrings[i] = RomanNumberFactory.GetUpperCaseString(pagecount);
break;
case 'r':
labelstrings[i] = RomanNumberFactory.GetLowerCaseString(pagecount);
break;
case 'A':
labelstrings[i] = RomanAlphabetFactory.GetUpperCaseString(pagecount);
break;
case 'a':
labelstrings[i] = RomanAlphabetFactory.GetLowerCaseString(pagecount);
break;
case 'e':
labelstrings[i] = "";
break;
}
pagecount++;
}
return labelstrings;
}