這涉及到使用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