Aspose.Words由HTML轉成PDF如何設定不要在行首出現符號?

pdf.PNG (22.4 KB)
如圖示,符號要往上一行縮或是在符號前有文字,
不要單獨符號成為一行。
以下是原始的 HTML 壓縮檔
ConvertHtml2PDF.zip (455 Bytes)

@ALANFKINFO,

在使用最新版本的Aspose.Words for .NET(即19.7)进行初始测试后,我们无法在最终重现此问题。 请使用以下简单代码查看我们从“ConvertHtml2PDF.html”生成的输出PDF(19.7.pdf (34.1 KB)):

Document doc = new Document("E:\\ConvertHtml2PDF\\ConvertHtml2PDF.html");
doc.Save("E:\\ConvertHtml2PDF\\19.7.pdf");
1 Like

感謝您的回覆,
我的版本也是19.7新版,
但您的操作有一些錯誤,
因為您的第二行太短了,
沒有自動換行,
所以符號不會出現在下一行的第一個字.
也許你可以做一下的設定
Aspose.Words.Document doc = new Document(“E:\ConvertHtml2PDF\ConvertHtml2PDF.html”);
doc.Sections[0].PageSetup.PaperSize = PaperSize.A4;
doc.Sections[0].PageSetup.TopMargin = 72;
doc.Sections[0].PageSetup.BottomMargin = 72;
doc.Sections[0].PageSetup.LeftMargin = 64;
doc.Sections[0].PageSetup.RightMargin = 64;
doc.UpdatePageLayout();
doc.Styles.DefaultParagraphFormat.Style.Font.NameFarEast = “標楷體”;
doc.Styles.DefaultParagraphFormat.Style.Font.NameAscii = “Times New Roman”;
doc.Styles.DefaultParagraphFormat.Style.Font.Kerning = -0.2;
doc.Styles.DefaultParagraphFormat.Style.ParagraphFormat.Alignment = ParagraphAlignment.Justify;
doc.Styles.DefaultParagraphFormat.AddSpaceBetweenFarEastAndAlpha = false;
doc.Styles.DefaultParagraphFormat.AddSpaceBetweenFarEastAndDigit = false;
doc.Styles.DefaultParagraphFormat.LineSpacing = 7.5;
doc.Styles.DefaultFont.Spacing = -0.2;
doc.CompatibilityOptions.GrowAutofit = false;
doc.CompatibilityOptions.UseFELayout = true;
DocumentBuilder builder = new DocumentBuilder(doc);
builder.Document.UpdatePageLayout();
MemoryStream outputStream = new MemoryStream();
options.UseHighQualityRendering = true;
builder.Document.Save(outputStream, options);
byte[] odt_pdf = outputStream.ToArray();
Response.Clear();
Response.AppendHeader(“Content-Disposition”, “attachment; filename=ExportedFile” + “.pdf”);
Response.ContentType = “application/pdf”;
Response.BinaryWrite(odt_pdf);
Response.End();

@ALANFKINFO,

请确保您的计算机上安装了以下字体:

  • MS Mincho
  • Times New Roman
  • PMingLiU

这是我们使用Aspose.Words for .NET 19.7和您的代码生成的输出:(19.7-new.pdf (34.2 KB))

1 Like

感謝您的回覆,
我有確認我有安裝了

  • MS Mincho
  • Times New Roman
  • PMingLiU
    也許您可以在代碼中加入這個 .css 檔案一起使用
    這樣版面才會換行 asposeWords.zip (659 Bytes)
    請允許我再詳述一下問題的產生:
    在html顯示第二行若只有一個符號,則會被自動縮到第一行,並不會單獨一個符號為一行。
    使用 [Aspose.Words for .NET 19.7] 將 html 轉成 pdf 時,
    產生的 pdf 則會將第一行最後一個符號顯示到第二行第一個位置,這是不對的.
    我想要的是任何一行的第一個字都不能"符號"為開始,
    你如果能複製我的問題,才能解決我的問題.
    因為這個問題是真的存在的.

@ALANFKINFO,

出现此问题的原因是页面中没有足够的空间/宽度。 您可以将其设置为横向或缩小左/右边距以克服此问题。

Document doc = new Document("E:\\ConvertHtml2PDF\\ConvertHtml2PDF.html");
// doc.FirstSection.PageSetup.Orientation = Orientation.Landscape;
// or
doc.FirstSection.PageSetup.LeftMargin = (0.25 * 72);
doc.FirstSection.PageSetup.RightMargin = (0.25 * 72);

doc.Save("E:\\ConvertHtml2PDF\\awjava-19.7.pdf");
1 Like

感謝您的回覆,
我知道可以縮小左/右邊距克服此問題,
但在 Microsoft 的 Word 2013 中,我並不須要自己去縮小左/右邊距,
我的意思是 aspose.words 無法做到像 Word 一樣嗎?
因為 Word 發現單獨一個符號時會自動往上一行擠到最後一個字,
我們也曾經購買過其他的列印套件,
它們也都會自動判斷在換行時並不會讓符號成為每一行的第一個字.
我可以提供一個 Word Symbol_Test.zip (16.4 KB)
檔案來解譯我的需求說明.
PS:因為是自動換行對齊的功能,所以我無法針對是不是符號在第一個字,
而去縮小左/右邊距,並不是每一行都需要縮小左/右邊距.

@ALANFKINFO,

但是,Aspose.Words模仿MS Word 2019的行为。请参阅以下HTML和Word文档。

Docs.zip (16.2 KB)

您还可以尝试使用以下代码:

Document doc = new Document("E:\\temp\\ConvertHtml2PDF\\ConvertHtml2PDF.html");
doc.CompatibilityOptions.OptimizeFor(Aspose.Words.Settings.MsWordVersion.Word2013);
doc.Save("E:\\Temp\\ConvertHtml2PDF\\awjava-19.7.docx");

您能否在此处分享MS Word 2013生成的HTML和PDF文件以进行进一步测试?

1 Like

感謝您的回覆…
可能我誤導您了,
我並不是要產生 word 檔案,
我一開始都是要由 html 轉成 pdf 檔,
只是我用目前 word 已經有的功能來說明我遇到轉換的問題,
(就是當我的 html 中有一行長度長到足以自換行時,
又剛好換行後第一個字是符號的問題),
Aspose.Words 能做到,當自動換行時能判斷?
如果第一個字是符號,則將符號前一個字一起自動換行下來,
而不單獨只讓符號被自動換行下來嗎??
以下是我分享的 MS Word 2013生成的HTML和PDF文件 Symbol_Test_02.zip (91.3 KB)

PS:其實您也可以自己建立一個 html 檔,
然後加入一行文字最後一個文字是符號,Sol : “ABCDE,”
以上例,在E和逗號之間每插入一個字就轉換成 pdf 出來看,
一直到加入的字串長度達到換行時,
您就會發現逗號被換下來成為第二行的第一個字,
word 在時候就會判斷不讓逗號自動換行,
當您又接著再插入一文字後,
才會將 (文字+逗號) ,一起自動換行到第二行,
我們在購買 Aspose 套件之前所使用的列印套件是可以做到這個判斷的,
不知道 aspose.words 是否也能提供這個自動換行時的符號判斷呢?

PPS:再附上實際 html 轉 pdf 的完整格式 ConvertHtml2PDF.zip (1.3 KB)

@ALANFKINFO,

出现此问题的原因是,与Aspose.Words生成的内容相比,MS Word 2013生成的PDF文件(Symbol_Test_02.pdf)具有不同的页面大小和左/右边距。 您可以使用以下代码解决此问题:

Document doc = new Document("E:\\temp\\Symbol_Test_02\\Symbol_Test_02.htm");
doc.getFirstSection().getPageSetup().setPaperSize(PaperSize.A4);
doc.getFirstSection().getPageSetup().setLeftMargin(1.25 * 72);
doc.getFirstSection().getPageSetup().setRightMargin(1.25 * 72);
doc.save("E:\\Temp\\Symbol_Test_02\\awjava-19.7.docx");
doc.save("E:\\Temp\\Symbol_Test_02\\awjava-19.7.pdf");
1 Like

感謝回覆,
但不知道為何我無法使用getFirstSection();
錯誤畫面截圖在這 Error.png (11.8 KB)
不過我認為應該不是setLeftMargin或setRightMargin的問題,
因為我們的 html 是程式動態生成的去轉換 pdf,
所以使用者輸入的每一行長度都不會一樣,
重點應該是在,
由 html 標籤 '<‘p’><‘span’>ABCDEFG, '</‘p’></‘span’>轉成 pdf 時,
當自動換下一行時如何防止不要讓符號成為下一行的行首.

@ALANFKINFO,

对于.NET,请使用以下代码:

Document doc = new Document("E:\\temp\\Symbol_Test_02\\Symbol_Test_02.htm");
doc.FirstSection.PageSetup.PaperSize = PaperSize.A4;
doc.FirstSection.PageSetup.LeftMargin = (1.25 * 72);
doc.FirstSection.PageSetup.RightMargin = (1.25 * 72);
doc.Save("E:\\Temp\\Symbol_Test_02\\19.7.docx");
doc.Save("E:\\Temp\\Symbol_Test_02\\19.7.pdf"); 

希望这可以帮助。

1 Like

感謝您的回覆,
這個不是我想解決問題的方法阿,
我們轉成 pdf 上版面的寬度都是固定的,
所以不能再去調整左右邊距.
能否跟我確定一件事,
在一個固定的長度內,
是否有支援當字串長度超過一行,
自動出現第二行時會判斷第二行的第一個字是否為符號???
而將這個符號縮回第一行最後一個位置,
我的目的就是符號不能為任何一行的第一個字,
而不是一直去調整我的邊距,
就像我之前提到的:
我的 html 檔案中的標籤 '<‘p’><‘span’>ABCDEFG, '</‘p’></‘span’>轉成 pdf 時,
當span內容字串長度達到二行以上時,
如何防止不要讓符號成為每一行的第一個位置出現.
我要確認如果aspose.word無法支援這個功能需求
我才能有依據跟使用者說明為何符號出現在第一個位置

PS:我們很在意在多行的狀態時,每一行的第一個字不能為符號,
即使調整了邊距,也是有可能讓符號出現在某一行的第一個字

@ALANFKINFO,

我担心,没有简单的方法来确定每一行的第一个字符。 但是,您可以在以下代码上构建逻辑以获取每行的第一个字符,然后进行决策(例如,减少左/右边距或减小字体大小):

Document doc = new Document("E:\\ConvertHtml2PDF\\ConvertHtml2PDF.html");

Node[] runs = doc.GetChildNodes(NodeType.Run, true).ToArray();
for (int i = 0; i < runs.Length; i++)
{
    Run run = (Run)runs[i];
    int length = run.Text.Length;

    Run currentNode = run;
    for (int x = 1; x < length; x++)
    {
        currentNode = SplitRun(currentNode, 1);
    }
}

DocumentBuilder builder = new DocumentBuilder(doc);
int count = 1;

NodeCollection smallRuns = doc.GetChildNodes(NodeType.Run, true);
foreach (Run run in smallRuns)
{
    builder.MoveTo(run);
    builder.StartBookmark("bm_" + count);
    BookmarkEnd end = builder.EndBookmark("bm_" + count);
    run.ParentNode.InsertAfter(end, run);

    count++;
}

LayoutCollector collector = new LayoutCollector(doc);
LayoutEnumerator it =  new LayoutEnumerator(doc);

float top = 0;
foreach (Bookmark bm in doc.Range.Bookmarks)
{
    if (bm.Name.StartsWith("bm_"))
    {
        it.Current = collector.GetEntity(bm.BookmarkStart);
        if (top < it.Rectangle.Top)
        {
            top = it.Rectangle.Top;
            Console.WriteLine(bm.Text);
        }
    }
}

foreach (Bookmark bm in doc.Range.Bookmarks)
{
    bm.Remove();
}

doc.JoinRunsWithSameFormatting();

希望这可以帮助。

1 Like

感謝您的回復,
我想請問:
當代碼獲取每行第一個字符要減小字體大小時,
可以只有針對第一個字符做設定,
讓第一個字符縮回去上一行嗎???

減少左右邊距是確定不可行的方式,
因為每一位使用者的字串內容及長度都不一樣.
當有100位或200位使用者的 html 要轉成 pdf 時.
您的減少左右邊距並不能滿足所有使用者不出現第一個字是符號的需求.
因為左右邊距的設定是固定的,
而使用者 html 的字串長度是不一定的,
所以符號出現在某一行第一個位置還是會發生的問題.

所以當 html 轉成 pdf 時,
Aspose.Words 目前並沒有提供每一行的第一個位置不能是符號的設定是嗎??

@ALANFKINFO,

我很擅长,在Aspose.Words中没有内置的方法来获得所需的输出。

通常,Aspose.Words模仿MS Word的行为,即如果您使用Aspose.Words将HTML文件转换为PDF,则输出将类似于MS Word生成的内容。

但是,并不总能保证Aspose.Words和MS Word生成的输出文档看起来与Web浏览器中显示的输入HTML文件完全相同。 这是因为Aspose.Words最初设计用于与Microsoft Word文档和HTML文档完全不同。 希望这可以帮助。

您还可以尝试/使用Aspose.HTML for .NET API将HTML文件转换为PDF。