这涉及到使用iTextSharp的5.5.8或5.5.9,我的测试工具是:iTextSharp的GetTextFromPage不返回
{
PdfReader pdfReader = null;
StringBuilder actual = new StringBuilder();
try
{
pdfReader = new PdfReader(@"Quotation for Macbook 6-16.pdf");
}
catch (iTextSharp.text.exceptions.BadPasswordException bpe)
{
actual.AppendLine(string.Format("Exception: Bad Password {0}", bpe));
}
catch (Exception ex)
{
actual.AppendLine(string.Format("Exception: PDFReader {0}", ex));
}
int pages = pdfReader.NumberOfPages;
for (int page = 1; page <= pages; page++)
{
try
{
String s = PdfTextExtractor.GetTextFromPage(pdfReader, page);
actual.AppendLine(string.Format("{0}", s));
}
catch (Exception ex)
{
actual.AppendLine(string.Format("Exception PDF Page {0}: {1}", page, ex));
}
}
foreach (var field in pdfReader.AcroFields.Fields)
{
actual.AppendLine(string.Format("{0}: {1}", field.Key, pdfReader.AcroFields.GetField(field.Key)));
}
}
我已经处理了成千上万的PDF文件调用GetTextFromPage的,但遇到特定的PDF根本不返回。我从GitHub下载代码,并通过它走了处理文件,它看起来像时,它调用InitFirst导致这里的连续循环的LineDashPattern的条件是LineDashPattern.cs
private void InitFirst(float phase) {
if (dashArray.Size > 0) {
while (phase > 0) {
phase -= dashArray.GetAsNumber(currentIndex).FloatValue;
currentIndex = (currentIndex + 1) % DashArray.Size;
elemOrdinalNumber++;
}
if (phase < 0) {
--elemOrdinalNumber;
--currentIndex;
currentElem = new DashArrayElem(-phase, IsEven(elemOrdinalNumber));
} else {
currentElem = new DashArrayElem(dashArray.GetAsNumber(currentIndex).FloatValue,
IsEven(elemOrdinalNumber));
}
}
}
传递相位码in是6.44245E + 8在dashArray 28.8中有两个入口,而对于这个阶段有9.6这样大的数字导致第一个,而因为28.8不足以根据float的分辨率降低相位而被阻塞。
我对内部知识不够了解,或者我会考虑进行更改。
我真的只对提取文本感兴趣,所以如果有一个设置我可以实现来过滤出对我来说也适用的行处理。
好的。作为循环条件的浮点运算是不可取的...... – mkl
我纠正并测试了这个问题,并将修改后的LineDashPattern.cs文件发送到[email protected]。修订版本基本上将模式长度除以阶段,并通过现有例程的其余部分处理剩余部分。 – Lee
我会建议你在这里发布修改后的代码,以便其他需要修复的人也能在手边。 iText 7是目前主要使用的版本,因此可能需要一些时间才能在官方发行版中应用iText 5.5.x修复程序。 – mkl